2012-01-03 24 views
15

我想使用自動實現的屬性,但同時我想調用每次屬性更改時的方法。如何覆蓋C#中的自動屬性設置

public float inverseMass 
{ 
    get; 
    set 
    { 
     onMassChanged(); 
     inverseMass = value; 
    } 
} 

以前的代碼是否對屬性進行遞歸調用?如果是這樣,如何實現呢?

+6

你不能在C#中做到這一點。你必須使用支持領域。 – 2012-01-03 20:07:00

+2

答案是YES ....它會創建一個連續的循環。 – 2012-01-03 20:08:16

+2

@UweKeim,這應該是一個答案。 – driis 2012-01-03 20:08:22

回答

22

如果您提供自己的get/set,那麼您需要爲變量提供自己的存儲空間。

private float _inverseMass; 

public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     _inverseMass = value; 
     onMassChanged(); 
    } 
} 
+6

很遺憾。使用某種常用的預定義單詞(比如'value')而不是創建自動屬性會很好。 – 2013-12-27 09:33:31

4

你不能在C#中做到這一點。

它的自動屬性或具有後臺字段的屬性。

8

使用支持字段改爲:

public float inverseMass 
{ 
    get 
    { 
     return _inverseMass; 
    } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

private float _inverseMass; 

有一次我讀的地方,C#的傢伙決定,他們想掩蓋的這些自動屬性的使用場景廣闊,但在特殊情況下,你必須去回到好的舊支持領域。

(說實話,我認爲喬恩斯基特告訴他們如何實現它們)

4

你會需要打破上面的出私有/公有成員,所以你沒有得到遞歸問題:

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"); } 
    } 
} 
1

這不能編譯,所以很難說它是否遞歸。

您不能僅指定自動屬性的一個部分。您需要在此情況下,使用後備場:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

雖然,像PostSharp面向aspected的編程框架,也許能夠幫助你與此有關。

0

使用私有變量作爲公共屬性的備份字段。

private float inverseMass; 

public float InverseMass{ 

    set 
    { 
     onMassChanged(); 
     inverseMass=value; 
    } 
    get 
    { 
     return inverseMass; 
    } 

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

你在這裏想說什麼?這個答案不能編譯。 – vcsjones 2012-01-03 20:12:54

1

正確的答案是以上給出的,但如果你想在Visual Studio迅速做到這一點,你可以使用代碼片段,而不是爲您生成的屬性。

對這篇文章的閱讀應該解釋它好一點:http://www.roelvanlisdonk.nl/?p=1007

如果你願意,你甚至可以創建自己的代碼片段添加重複代碼。您甚至可以使用它來快速生成如上所述的INotifyPropertyChanged實現。