繁体   English   中英

C# static 字段命名约定是什么?

[英]What is the C# static fields naming convention?

我最近开始使用 ReSharper,这是一个很棒的工具。 今天我遇到了 static 字段的命名规则,即用下划线作为前缀。

private static string _myString;
  1. 这真的是命名 static 个变量的标准方式吗? 如果是这样,那只是个人喜好和风格,还是有某种较低层次的影响? 例如编译 JIT 等?
  2. 这种风格起源于哪里? 我一直将它与 C++ 联系在一起,对吗?

Microsoft 指南对私有字段保持沉默,它们只关注公开可见的成员。

常见的约定是camelCase、_camelCase,有时甚至是C++/MFC m_camelCase 的宿醉。

如果您使用不带前缀的驼峰命名法,则您的属性支持字段将与属性名称不同,仅在大小写的情况下,这在 C# 中不是问题,但在不区分大小写的语言(如 VB.NET)中将不起作用。

很多人,包括我自己,都喜欢使用下划线前缀,以便在所有语言中都可以使用相同的标准。 根据我的经验,下划线比 m_ 更常见。

根据MSDN ,对静态字段使用Pascal Case 当 MSDN 和 StyleCop 相互矛盾时,我总是轻笑:)。

因此,如果您遵循 MSDN 标准,正确的方法是:

private static string MyString;

根据 StyleCop (并使用默认设置),命名大多数字段(如下所述)的正确方法是在开头使用小写字母。

SA1306:字段名称必须BeginWithLowerCaseLetter

... 字段和变量名称必须以小写字母开头,除非该字段是公共或内部、常量或非私有和只读的。 在这些情况下,该字段应以大写字母开头。

另请参阅SA1309: FieldNamesMustNotBeginWithUnderscore

它实际上是私有字段的样式,无论是否静态。 (至少在 ReSharper 中)

约定是您公司的编码标准所说的。

我对 MSDN 指南(使用 Pascal 案例)的问题是它导致私有静态变量和公共(非静态)属性之间没有区别。 静态属性也会出现同样的问题 - 静态和非静态之间没有区别。

或许这是故意的?

解决此问题的一种方法是对静态变量使用与非静态变量相同的标准,但始终通过在类名前加上前缀来限定静态变量的使用。 它可能需要输入一些额外的字符,但它使代码更具可读性。 例如:

public class Employee
{
    private static Int32 thresholdPercentage = 5;
    public static String TooMuchMessage = "Unacceptable pay rise - sorry!";

    private Decimal _salary = 0.0m;

    public void RaiseSalary(Int32 raiseAmountPercentage)  
    {
        if (raiseAmountPercentage > Employee.thresholdPercentage)
            throw new ApplicationException(Employee.TooMuchMessage);

        _salary *= 1 + (raiseAmountPercentage / 100);

        return;
    }
}

2021 年更新

根据Microsoft 2021 年发布的 C# 编码约定private static变量应以s_前缀开头,后跟驼峰式大小写。 所以,它应该如下所示:

private static string s_myString;

对于静态字段,我选择了 StaticPascalCase(例如StaticPersonCache ),因为它清楚地将它与实例变量区分开来。 这包括私有静态字段以及具有其他可见性修饰符的静态字段。

对于静态变量,我不太关心通过名称指示公共/私有可见性,而不是指示变量如何在实例之间运行。 此外,由于没有(实际上不应该有)许多静态变量,因此不经常应用“类似匈牙利语”的修饰符。

同样,对于线程静态变量([ThreadStatic] 或 ThreadLocal),我使用的约定是 TS_UpperCamelCase(例如TS_Random )。 再一次,这种对规范的“破坏”传达了其他开发人员乍一看可能看不到的非常重要的信息。 因此,该名称在某种程度上被用作警示标志。

我使用 ReSharper 并相应地调整了警告/提示; 大多数其他命名约定保留在 ReSharper 默认设置中。

我为静态/线程静态字段选择这种“非标准”约定(注意:Microsoft 在 .NET 库中的某些代码中使用 TS_)是因为我遇到了多个“怪癖”,因为静态/ ThreadStatic/Instance 变量:使用StaticXTS_X_x很难做到这一点。

  1. 变量名称没有明确的标准规则。 对于允许的和不允许的(例如不能以数字开头)有 C# 编译器要求,但编程语言风格规则通常由程序员/组织决定。 ReSharper 具有预定义的样式规则; 然而,它们只是在约定优于配置方法中设置为默认值并且是可修改的。

  2. 您可以查看这篇 Wikipedia 文章,了解Camel Casing背后的历史。

这里的其他答案有点令人困惑。

.NET 标准

务必在字段名称中使用 PascalCasing。
字段命名准则适用于静态公共和受保护字段。

例如:MyStaticVariable、ActiveUserCount 等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM