我正在开发一个符合 CLS 的类型库,我在其中有一个类,其中包含私有(private)、 protected 和公共(public)字段和属性。我使用下划线符号 (_) 作为私有(private)或 protected 字段的前缀,并使用小首字母将它们与具有相同名称的属性区分开来。看起来是这样的:
class SomeClass
{
private int _age; //Here is OK
public int Age { get { return this._get; } }
}
但是当我尝试使用 protected 字段时,我遇到了下一个问题:
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 风格的前缀吗?
最佳答案
这是一个更正确的版本,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 个可以执行的合理操作:
- 调用事件
- 订阅/取消订阅事件
前者应该通过 On*
模式来完成;后者应该只使用常规访问器(否则会违反锁)。此外,即使我们假设 lock(this.StateChanged)
是一个拼写错误(这将是一个非常非常糟糕的事情作为锁定对象使用 - 它 根本无法工作),请注意,在 C# 4.0 中,编译器内置了一个更高效的锁定策略(使用 Interlocked
而不是 Monitor
) 当你写一个“field-like”事件时(即没有明确的add
/remove
)。因此,这里的首选方法是:
public event EventHandler<StateChangedEventArgs> StateChanged;
protected virtual void OnStateChanged(StateChangedEventArgs args) {
var snapshot = StateChanged; // avoid thread-race condition
if(snapshot != null) shapshot(this, args);
}
然后...就是这样!
- 如果子类想要订阅/取消订阅(不理想,但嗯)它只使用
StateChanged +=
和StateChanged -=
- 如果子类想要调用事件,它会调用
OnStateChanged(...)
- 如果子类想要调整事件逻辑,它会向
OnStateChanged
添加一个override
不需要任何非私有(private)字段。
关于c# - protected 字段的符合 CLS 的正确命名约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7567464/