2011-09-27 10 views
9

我正在開發一個符合CLS的類型庫,並且在它內部有一個類,它包含私有的,受保護的和公共的字段和屬性。我使用下劃線符號(_)作爲私有或受保護字段的前綴,並使用小首字母來區分它們來自具有相同名稱的屬性。它看起來如此:什麼是符合CLS的受保護字段的命名約定?

class SomeClass 
{ 
private int _age; //Here is OK 

public int Age { get { return this._get; } } 
} 

但是當我嘗試使用受保護的領域我有一個問題碰撞:

class SomeClass 
{ 
protected int _age; //Here is NOT CLS-compliant (because of _ can't be the first symbol of identifier) 

public int Age { get { return this._get; } } 
} 

然後我試圖以這種方式做:

class SomeClass 
{ 
protected int age; //Here is NOT CLS-compliant (because of age and Age differ only in one symbol) 

public int Age { get { return this._get; } } 
} 

請,請告訴我,這種情況下開發人員之間符合CLS標準或約定的是什麼?我有沒有像l_age一樣使用C風格的前綴?

回答

10

這裏有一個更正確的版本,IMO:

private int _age; 
public int Age { 
    get { return this._age ; } 
    protected set { this._age = value; } 
} 

或者乾脆:

public int Age { get; protected set; } 

如果你正確地封裝它,那麼它不要緊什麼領域是所謂的,因爲沒有什麼以外的類型可以看到它。


在評論,事件的問題,然後提出,與例如:

protected EventHandler<StateChangedEventArgs> _stateChanged; 
public event EventHandler<StateChangedEventArgs> StateChanged 
{ 
    add { lock (this.StateChanged) { this._stateChanged += value; } } 
    remove { lock (this.StateChanged) { this._stateChanged -= value; } } 
} 

在這裏,我再次斷言,有沒有原因領域進行保護;事件不屬於派生類的。它有2個明智的操作也可以想執行:

  1. 調用事件
  2. 訂閱/退訂事件

前者應通過On*模式進行;後者應該只使用常規訪問器(否則它違反了鎖)。此外,即使我們假設lock(this.StateChanged)是一個錯字(這將是作爲-IT 不會在所有工作鎖定對象使用一個非常,非常糟糕的事情),請注意,在C#4.0編譯器當您編寫「類似字段」事件(即沒有明確的add/remove)時,內置的更高效的鎖定策略(使用Interlocked而不是Monitor)。因此,這裏優選的方法是:

public event EventHandler<StateChangedEventArgs> StateChanged; 
protected virtual void OnStateChanged(StateChangedEventArgs args) { 
    var snapshot = StateChanged; // avoid thread-race condition 
    if(snapshot != null) shapshot(this, args); 
} 

和......就是這樣!

  • 如果子類要訂閱/取消(不理想,但MEH),它只是使用StateChanged +=,如果子類要調用的事件,它調用OnStateChanged(...)
  • 如果子類要StateChanged -=
  • 調整事件邏輯,它將override添加到

不需要任何非專用字段。

+0

嗯......如何處理事件? – Vasya

+0

@ Praetor12什麼*關於*事件?派生類需要訪問該領域的什麼?也許添加一個特定的事件相關的例子? –

+0

是的。基類有一個事件,它由派生類方法調用。對於這樣的機制,我這樣做了: protected EventHandler _stateChanged; 公共事件EventHandler StateChanged; { add {lock(this.StateChanged){this._stateChanged + = value;刪除{lock(this.StateChanged){this._stateChanged - = value;}} remove { }} } – Vasya

2

要備份馬克的回答,對Field Design從微軟的指導規定:

公共及受保護的領域沒有很好的版本,而不是通過代碼訪問安全需求的保護。不要使用公開可見的字段,而要使用私有字段並通過屬性公開它們。

這可能是爲什麼你不會找到關於命名他們的任何有用的指導(其實naming guidelines只是點回到了場設計頁)。