2016-05-23 85 views
7

我有一個目前自動的屬性。沒有身體的吸氣器,安裝員

public string MyProperty { get; set; } 

不過,我現在需要它來執行一些動作每次改變時間,所以我想邏輯添加到二傳手。所以,我想要做的事,如:

public string MyProperty { 
    get; 
    set { PerformSomeAction(); } 
} 

然而,這並沒有建立... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

我不能只是有吸回MyProperty,因爲它會導致無限循環。

有沒有這樣做的方法,或者我必須聲明一個私有變量來引用?我寧願不爲MyProperty使用,通過了代碼都在這個類和外面

回答

8

您需要使用與支持字段屬性:

private string mMyProperty; 
public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
+2

這很傷心,不是嗎。我的意思是爲什麼他們會允許像'string myStr {get;私人設置; }'但不是'{get;設置{...}}。 – Parziphal

2

您不容實現一個沒有其他,因爲當使用它時,它指的是在自動生成屬性的情況下自動生成的(隱藏)後臺字段。但是,當你實現一個你必須設置這種支持領域的兩種方式。

的自動方式是隻爲這一個快捷方式:

private string _property; 
public string MyProperty 
{ 
    get { return _property; } 
    set { _property = value; } 
} 

所以,如果you'd省略的方法之一隱藏字段(這是什麼getter和setter方法實際上是)如何把這個方法知道如何存儲/獲得價值?

0

如果你在setter中做某些事情,那麼你將不得不顯式聲明這個變量。例如。

private string _myProperty; 
public string MyProperty { 
    get { return _myProperty; }; 
    set 
    { 
     _myProperty = value; 
     PerformSomeAction(); 
    } 
} 

或 - 二傳手可以傳遞價值的功能,你想要做什麼它那裏...假設你想更改/檢查值的函數PerformSomeAction()

1

您需要或者爲吸氣者和二傳手提供一個身體,或者兩者都不。

因此,如果您定義其中一個,它不再是一個自動屬性。

所以你要做的:

要麼

public string MyProperty { 
    get; 
    set; 
}// Automatic property, no implementation 

OR

public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
0

這是類似的問題C# getter and setter shorthand

當您手動指定setter時,它不會使用getter的自動屬性機制,這就是爲什麼錯誤信息就像缺少它一樣。指定setter時,您需要編寫自己的getter。