什么C#命名方案可以用于Property&符合CLS的会员?

时间:2011-11-26 23:48:10

标签: c# cls-compliant

请考虑以下不符合CLS的代码(仅在的情况下有所不同):

protected String username;

public String Username { get { return username;} set { username = value; } }

所以我改成了:

protected String _username;

public String Username { get { return _username;} set { _username = value; } }

这也不符合CLS(具有前导下划线)。

是否存在任何不违反cls合规性的成员/属性的通用命名方案

4 个答案:

答案 0 :(得分:5)

不要公开支持字段,而是将属性设置为虚拟,以便继承者可以覆盖功能,而不会暴露支持字段的实现。

private String username;

public virtual String Username { get { return username;} set { username = value; } }

继承不应该知道你的类实现。

请参阅Best way to expose protected fields

答案 1 :(得分:2)

这组规则适用于Visual Basic,但C#应该有类似的设置:

Visual Basic中的元素名称必须遵守以下规则:

  

必须以字母字符或下划线(_)开头。

     

它必须只包含字母字符,十进制数字和下划线。

     

如果它以下划线开头,则必须包含至少一个字母字符或十进制数字。

     

长度不得超过1023个字符。

但是,以下内容也适用:

  

以下划线(_)开头的元素名称不是公共语言规范(CLS)的一部分,因此符合CLS的代码不能使用定义此类名称的组件。但是,元素名称中任何其他位置的下划线都符合CLS。

以上内容来自MSDN Documentation

以下是MSDN上Common Language Specification文档的链接,该文档反过来引用了CLS命名约定的最终仲裁者:Annex 7 of Technical Report 15 of the Unicode Standard 3.0

答案 2 :(得分:1)

MFC来救援。只需使用旧的m_前缀:

private string m_Username;
public string Username ...

答案 3 :(得分:0)

你想用这个来实现什么?

public String Username {get; protected set};

private String _username;

protected void setUserName(String argUsername);
{
  if (_username != Username) // an overload of String.Compare would be better here
  {
    _username = value;
    // Do the stuff you have to do because username has changed
  }
}

public String Username {get {return _username;} protected set {setUsername(value);}}

你的方式,为了获得CLS合规性,你不得不称你为pulic和prtectred版本不同的名字,这将是'混乱。