我正在开发一个符合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风格的前缀吗?
发布于 2011-09-27 18:16:00
这是一个更正确的版本,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; } }
}在这里,我再次声明,此字段没有任何受保护的理由;该事件不属于派生类。它有两个可以执行的合理操作:
的event
前者应该通过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),它只使用OnStateChanged和StateChanged -=
OnStateChanged(...)
OnStateChanged
添加一个override
不需要任何非私有字段。
发布于 2011-09-27 18:21:15
为了支持马克的答案,微软的Field Design指南写道:
公共字段和受保护字段的版本不好,并且不受代码访问安全要求的保护。使用私有字段并通过属性公开它们,而不是使用公共可见字段。
这可能就是为什么你找不到任何关于命名它们的有用的指导(事实上,naming guidelines只是指向字段设计页面)。
https://stackoverflow.com/questions/7567464
复制相似问题