2013-08-19 76 views
0

我想在作爲對象的公共變量的bool變量發生更改時立即通知程序。例如;查詢對象的公共變量

說,在Windows窗體應用程序中創建了conn類的實例。

有一個Ready變量,存在類conn的公共變量。

我希望在此變量發生變化時收到通知。

我做了一個快速的研究,以解決這個問題在stackoverflow但答案建議使用屬性,我認爲不適合我的應用程序。

+0

爲什麼不使用事件 – makc

+1

你需要澄清一下,我很害怕。爲什麼房產「不合適」? 'INotifyPropertyChanged'將是一個很好的開始。 –

+0

語言中沒有任何內容,您必須使用自定義事件手動實現它。 –

回答

4

我會假設你指的是一個領域,當你說公衆VA可變結構。

除了少數例外,最好不要在C#類的公共領域,而私人領域與公共存取:

class BadClass 
{ 
    public int Value; // <- NOT preferred 
} 

class GoodClass 
{ 
    private int value; 

    public int Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 
} 

原因之一來構建你的代碼這種方式,所以你可以做不止一件物品的吸氣和吸塵器。適用於您的情況的一個例子是屬性更改通知:

class GoodClass : INotifyPropertyChanged 
{ 
    private int value; 

    public int Value 
    { 
     get { return this.value; } 
     set 
     { 
      this.value = value; 
      this.OnPropertyChanged("Value"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name); 
     } 
    } 
} 

如果要實現這樣的類,你可以使用它是這樣的:如果你改變了Value財產

void SomeMethod() 
{ 
    var instance = new GoodClass(); 
    instance.PropertyChanged += this.OnPropertyChanged; 
} 

void OnPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Value") 
    { 
     // Do something here. 
    } 
} 

,它不僅會改變底層字段的值,還會引發事件,並調用事件處理函數。

+1

根據你的要求,在你的屬性設置器中增加一些檢查如'if(this.value!= value){...}'以避免在沒有任何改變時引發'PropertyChanged'事件。 –

+0

@WillemDuncan這是一個很好的建議。 – Dan

+0

非常感謝您的迴應,祝您有個愉快的時光。這是我需要的形式,我可以理解。 – talkanat

1

您想爲此使用Observer pattern。在.NET中最直接的做法是事件系統。在類conn,創建一個事件:

public event EventHandler ReadyChanged; 

,然後當你創建的conn一個實例,訂閱該事件:

o.ReadyChanged += (s, e) => 
{ 
    // do something 
} 

,最後,當conn的標誌變化,火通過新的方法事件命名OnReadyChanged

protected virtual void OnReadyChanged() 
{ 
    if (ReadyChanged != null) { ReadyChanged(this, new EventArgs()); } 
}