我想使用自動實現的屬性,但同時我想調用每次屬性更改時的方法。如何覆蓋C#中的自動屬性設置
public float inverseMass
{
get;
set
{
onMassChanged();
inverseMass = value;
}
}
以前的代碼是否對屬性進行遞歸調用?如果是這樣,如何實現呢?
我想使用自動實現的屬性,但同時我想調用每次屬性更改時的方法。如何覆蓋C#中的自動屬性設置
public float inverseMass
{
get;
set
{
onMassChanged();
inverseMass = value;
}
}
以前的代碼是否對屬性進行遞歸調用?如果是這樣,如何實現呢?
如果您提供自己的get/set,那麼您需要爲變量提供自己的存儲空間。
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
_inverseMass = value;
onMassChanged();
}
}
很遺憾。使用某種常用的預定義單詞(比如'value')而不是創建自動屬性會很好。 – 2013-12-27 09:33:31
你不能在C#中做到這一點。
它的自動屬性或具有後臺字段的屬性。
使用支持字段改爲:
public float inverseMass
{
get
{
return _inverseMass;
}
set
{
onMassChanged();
_inverseMass = value;
}
}
private float _inverseMass;
有一次我讀的地方,C#的傢伙決定,他們想掩蓋的這些自動屬性的使用場景廣闊,但在特殊情況下,你必須去回到好的舊支持領域。
(說實話,我認爲喬恩斯基特告訴他們如何實現它們)
你會需要打破上面的出私有/公有成員,所以你沒有得到遞歸問題:
private float _inverseMass;
public float inverseMass
{
get { return this._inverseMass; }
set { this._inverseMass = value; onMassChanged(); }
}
但是,你看過INotifyPropertyChanged
接口嗎?它幾乎可以滿足你的需求,而且根據你寫的內容,它可以在本地得到支持。
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String property)
{
var event = this.PropertyChanged;
if (event != null)
{
event(this, new PropertyChangedEventArgs(property));
}
}
private float _inverseMass;
public float inverseMass
{
get { return this._inverseMass; }
set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); }
}
}
這不能編譯,所以很難說它是否遞歸。
您不能僅指定自動屬性的一個部分。您需要在此情況下,使用後備場:
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
onMassChanged();
_inverseMass = value;
}
}
雖然,像PostSharp面向aspected的編程框架,也許能夠幫助你與此有關。
使用私有變量作爲公共屬性的備份字段。
private float inverseMass;
public float InverseMass{
set
{
onMassChanged();
inverseMass=value;
}
get
{
return inverseMass;
}
}
public float inverseMass
{
get;
set
{
if (inverseMass != value)
{
inverseMass = value;
onMassChanged();
}
}
}
你在這裏想說什麼?這個答案不能編譯。 – vcsjones 2012-01-03 20:12:54
正確的答案是以上給出的,但如果你想在Visual Studio迅速做到這一點,你可以使用代碼片段,而不是爲您生成的屬性。
對這篇文章的閱讀應該解釋它好一點:http://www.roelvanlisdonk.nl/?p=1007
如果你願意,你甚至可以創建自己的代碼片段添加重複代碼。您甚至可以使用它來快速生成如上所述的INotifyPropertyChanged實現。
你不能在C#中做到這一點。你必須使用支持領域。 – 2012-01-03 20:07:00
答案是YES ....它會創建一個連續的循環。 – 2012-01-03 20:08:16
@UweKeim,這應該是一個答案。 – driis 2012-01-03 20:08:22