C# 命名和大小写规范

3

我是一个使用VB的开发者,过去会在模块级别变量前加上“_”。

我正在使用FXCop、StyleCop以及(我认为是内置的代码分析工具,或者可能是指向FXCop,不确定),并试图采用最常接受的命名惯例。您将如何命名以下模块级别的私有、属性和参数字段,以使所有这些代码分析工具都满意,并符合通常接受的MS标准?请注意,将参数名称与私有模块级别字段相同可能会令人困惑,而FXCop错误地告诉我要在“sourcefile”参数字段引用之前加上“this。”

我的方法是否可接受,只需要在模块级别的私有变量中使用小写字母,然后将参数重命名为像“mySourceFile”或“sourceFileIn”这样不自然的名称?它感觉很勉强。参数应该是驼峰式大小写。我的模块级别变量是否错了?

    public class Restartability
    {
        private readonly string sourceFile;

        public Restartability(string sourceFile)
        {
            this.sourceFile = sourceFile;
        }

        public string SourceFile
        {
            get { return sourceFile; }
        }  

   }

1
这是我总是关闭的第一个 StyleCop 规则之一。我不喜欢冗长的 this.<field> 语法。我也在我的字段前加下划线前缀。 - Daniel Hilgarth
1
首先,按照您现有的代码库进行命名。其次,根据您的组织设置约定(包括使用前缀或匈牙利命名法等)。第三,如有必要,请参考官方指南。最后,使用StyleCop来遵循您想要的规则;它只是一个工具,无法知道什么对您最好。 - millimoose
请记住,命名约定 - 每个命名约定 - 都是完全任意的。此外,在任何真实的代码库中,它都不会成为代码“易于理解”的关键因素。追求可读性标准只有在你没有为了细节而忘记大局的时候才值得。 - millimoose
7个回答

5

我认为私有字段变量应该以 '_' 为前缀。

这样做可以让你:

private readonly string _sourceFile;

然而,可以争论的是(来自书籍《代码整洁之道》),没有前缀应该是不必要的,因为你不应该在一个类中拥有太多的变量,以至于很难区分字段作用域变量和非字段作用域变量。

1
警告 1 SA1309:字段名称不得以下划线开头。 - Chad
3
在另一个帖子中对那个特定警告进行更多讨论: https://dev59.com/HHA75IYBdhLWcg3wlqIT - Sheldon Warkentin
2
我不喜欢在变量名前加下划线。没有必要在变量名前加下划线。使用this,你可以轻松地引用和查找所有私有字段变量,而不会把它们弄乱。 - Adam Spicer

3

最终,对于C#唯一普遍被接受的命名约定如下:

  • 命名空间名称使用PascalCase
  • 类型名称使用PascalCase
  • 类型的公共和受保护成员,包括方法、属性和字段,使用PascalCase

此外,一般被接受的但不是普遍的是:

  • 方法和构造函数参数使用camelCase。

其余部分差异很大,因此并不重要。只要您遵守上述命名约定,就没有问题了。


为了使构造函数参数成为驼峰式命名,类名称也必须是驼峰式的。我认为类名并不是驼峰式的。警告1 SA1300:类名应以大写字母开头:restartability。 - Chad
构造函数参数,而不是构造函数的名称。构造函数只是与类名相同的特殊方法。我特别指的是这些方法的参数。 - Randolpho
这似乎是少数人的观点,但对我来说,将受保护的方法设为驼峰式命名法是有逻辑意义的。如果我有一个变量 MyClass x,显然我只能调用公共方法,例如 x.DoSomething(),所以我会将任何不能在外部调用的内容都设为驼峰式命名法...即受保护的方法。如果我有 MyDerivedClass : MyClass,并且一个变量 MyDerivedClass y,如果 someMethod() 是受保护的并且在基类中定义,我将无法调用 y.someMethod()。 - KevinVictor

2

通常情况下,局部变量和成员变量的首字母小写。在我的工作中,我们选择以 _ 作为前缀来表示成员变量,但这只是惯例而已。

我会这样写:

public class Restartability {

  private readonly string _sourceFile;

  public Restartability(string sourceFile) {
    _sourceFile = sourceFile;
  }

  public string SourceFile {
    get { return _sourceFile; }
  }  

}

或者使用属性缩写:

public class Restartability {

  public string SourceFile { get; private set; }

  public Restartability(string sourceFile) {
    SourceFile = sourceFile;
  }

}

这并不会使后备变量只读,但是setter是私有的,所以只有类内部的代码可以设置它。


警告1 SA1309:字段名称不得以下划线开头。简写将只读属性更改为读\写。 - Chad
它只能在类内部写入,而在外部它被标记为私有。在 FxCop 中关闭警告,个人认为。 - Fen

1

当我有私有和公共属性具有完全相同的名称时,我会在私有属性名称末尾加上下划线。我认为这是一个好习惯,在我们公司中我们都这样做。我们都是 .net 开发人员。


这倒不是个坏主意,直到这种习惯和给模块级变量添加前缀 _ 一样流行,并且 FxCop也跟上来禁止这种做法。 - Chad
纠正:StyleCop 已经发现问题了。警告1 SA1310:字段名称不应包含下划线。即 (任何地方)。 - Chad
个人而言,我从未使用过这个软件。我会好好研究一下!感谢你的建议。 - Eric Frick

1

C#对象字段的最常见命名方案是

  • 使用“m_”前缀:m_sourceFile
  • 使用“_”前缀:_sourceFile
  • 没有前缀,使用this.来引用或者直接使用旧的sourceFile

0
如果你刚开始学习C#并且正在考虑编码风格和规范,我真的推荐一本书叫做The Elements of C# Style
我还建议你自己拥有Resharperstylecop for resharper plugin
编码风格是开发人员之间争议不断的问题,毫无疑问这里会有很多不同的意见,但我认为最重要的一条规则是,无论使用什么样的风格,都要保持一致。
一个非常优秀的开发人员曾经对我说过,无论项目有多大,它应该看起来像是由同一个开发人员在同一天编写的。

-1

现代IDE应该具有突出显示特定类变量的功能,因此_或m_或this.应该是多余的。请参见:Visual Studio相同令牌突出显示以获取有关在VS中进行此操作的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接