C# 字段命名:命名准则与CLS合规性

C# 字段命名:命名准则与CLS合规性,c#,naming-conventions,naming,C#,Naming Conventions,Naming,据我所知,与属性相关的字段应以lowerCamelCase命名,其对应属性的命名方式应与PascalCase相同 public class Person { protected int ageFullYears; public int AgeFullYears{ get { return ageFullYears; } } } 另一种最常见的做法与第一种相同,但字段名前面有下划线 public class Pers

据我所知,与属性相关的字段应以lowerCamelCase命名,其对应属性的命名方式应与PascalCase相同

public class Person {
    protected int ageFullYears;
    public int AgeFullYears{
        get {
            return ageFullYears;
        }
    }
}
另一种最常见的做法与第一种相同,但字段名前面有下划线

public class Person {
    protected object _ageFullYears;
    public object AgeFullYears{
        get {
            return _ageFullYears;
        }
    }
}
然而,正如许多人所注意到的那样,这两种做法都不是,因为CLS合规性规则要求不同类成员的名称不应只是大小写不同,而且还要求

标识符的第一个字符可以是任何Unicode大写字母、小写字母、标题字母、修饰字母、其他字母或字母编号

无论反对使用受保护的实例字段的理由是什么,它们都是语言的现实,有时也有它的用途


因此,基本上,问题是:在C#中是否有符合CLS的命名属性相关实例字段的事实标准?

您把它搞混了。命名指南最初是微软的一份内部文件,它为程序员在处理.NET代码时设置了标准。他们发表这篇文章的理论基础是,它可能对客户有用,您是否将其作为自己的指南完全取决于您的开发团队。CLSCompliant规则是明确规定的,它只为字符集和由大小写引起的歧义设置规则,不禁止前导下划线或驼峰大小写。当你看到一个前导下划线时,你可能会找到一个喜欢Resharper的程序员。@HansPassant我从来没有说过命名准则是C#编码的“法律”标准。然而,这是最接近于语言范围内的编码约定的东西,而最接近的东西是不符合CLS的。你需要更明确地说明你的理论,即它不是CLS compliant。您链接到了这些规则,其中三个属于“命名约定”类别。@HansPassant感谢您的反馈,我已经更正并详细阐述了我的问题。您引用的部分是Unicode技术报告的逐字副本。“这是C语言和其他编程语言中使用的标识符语法的自然扩展”,引用了一些可疑之处。C语言在允许前导下划线方面有很长的历史。事实上,在某些情况下需要使用它。拯救它的唯一方法是在标识符中使用非ASCII字符时的模糊性。实际上,这不是一个已知的问题,编译器当然不会抱怨。你把它搞混了。命名指南最初是微软的一份内部文件,它为程序员在处理.NET代码时设置了标准。他们发表这篇文章的理论基础是,它可能对客户有用,您是否将其作为自己的指南完全取决于您的开发团队。CLSCompliant规则是明确规定的,它只为字符集和由大小写引起的歧义设置规则,不禁止前导下划线或驼峰大小写。当你看到一个前导下划线时,你可能会找到一个喜欢Resharper的程序员。@HansPassant我从来没有说过命名准则是C#编码的“法律”标准。然而,这是最接近于语言范围内的编码约定的东西,而最接近的东西是不符合CLS的。你需要更明确地说明你的理论,即它不是CLS compliant。您链接到了这些规则,其中三个属于“命名约定”类别。@HansPassant感谢您的反馈,我已经更正并详细阐述了我的问题。您引用的部分是Unicode技术报告的逐字副本。“这是C语言和其他编程语言中使用的标识符语法的自然扩展”,引用了一些可疑之处。C语言在允许前导下划线方面有很长的历史。事实上,在某些情况下需要使用它。拯救它的唯一方法是在标识符中使用非ASCII字符时的模糊性。实际上,这不是一个已知的问题,编译器当然不会抱怨。