首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >受保护字段的正确CLS兼容命名约定是什么?

受保护字段的正确CLS兼容命名约定是什么?
EN

Stack Overflow用户
提问于 2011-09-27 18:12:57
回答 2查看 3.8K关注 0票数 9

我正在开发一个符合CLS的类型库,并且在其中有一个类,其中包含私有、受保护和公共字段和属性。我使用下划线符号(_)作为私有或受保护字段的前缀,并使用较少的第一个字母来区分它们与同名的属性。看起来是这样的:

代码语言:javascript
复制
class SomeClass
{
private int _age; //Here is OK

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

但是当我尝试使用受保护的字段时,我遇到了下一个问题:

代码语言:javascript
复制
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; } }
}

然后我试着这样做:

代码语言:javascript
复制
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风格的前缀吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-27 18:16:00

这是一个更正确的版本,IMO:

代码语言:javascript
复制
private int _age;
public int Age {
    get { return this._age ; }
    protected set { this._age = value; }
}

或者简单地说:

代码语言:javascript
复制
public int Age { get; protected set; }

如果您正确地封装了它,那么字段的名称并不重要,因为该类型之外的任何都看不到它。

在评论中,提出了事件的问题,并给出了示例:

代码语言:javascript
复制
protected EventHandler<StateChangedEventArgs> _stateChanged;
public event EventHandler<StateChangedEventArgs> StateChanged
{
    add { lock (this.StateChanged) { this._stateChanged += value; } }
    remove { lock (this.StateChanged) { this._stateChanged -= value; } }
}

在这里,我再次声明,此字段没有任何受保护的理由;该事件不属于派生类。它有两个可以执行的合理操作:

  1. 调用event

的event

  • subscribe/unsubscribe

前者应该通过On*模式完成;后者应该只使用常规访问器(否则会违反锁)。此外,即使我们假设lock(this.StateChanged)是一个拼写错误(这将是一件非常非常糟糕的事情,因为-it 的锁对象在中根本不能工作),请注意,在C# 4.0中,当你编写一个“类似字段”的事件(即没有显式的add/remove)时,编译器内置了一个更有效的锁策略(使用Interlocked而不是Monitor)。因此,这里的首选方法是:

代码语言:javascript
复制
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),它只使用OnStateChangedStateChanged -=

  • if。子类想要调用事件,它调用OnStateChanged(...)

  • if。如果子类想要调整事件逻辑,它会向OnStateChanged

添加一个override

不需要任何非私有字段。

票数 10
EN

Stack Overflow用户

发布于 2011-09-27 18:21:15

为了支持马克的答案,微软的Field Design指南写道:

公共字段和受保护字段的版本不好,并且不受代码访问安全要求的保护。使用私有字段并通过属性公开它们,而不是使用公共可见字段。

这可能就是为什么你找不到任何关于命名它们的有用的指导(事实上,naming guidelines只是指向字段设计页面)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7567464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档