c# - protected 字段的符合 CLS 的正确命名约定是什么?

标签 c# .net naming-conventions

我正在开发一个符合 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 个可以执行的合理操作:

  1. 调用事件
  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/

相关文章:

naming-conventions - 返回函数的函数的命名约定是什么?

c# - C# 开发人员的 C++ 命名约定

c# - 如何修改消息正文 - Mimekit Message

c# - 列表排序优先特定值

c# - 远程服务器返回错误 : (422)

.net - "boxing"在 .NET 中如何工作?

.net - GTK#中是否存在系统颜色集合?

android - 带 alpha 的颜色的 Android 命名约定是什么?

c# - 无法在 VS 2015 内存使用分析器中找到预期的对象

c# - Winforms 透明度问题(我为之着迷)