私有成员变量的C#编码标准

30 c# coding-style

我看到了两种编写私有成员变量标准的常用方法:

class Foo
{
    private int _i;
    private string _id;     
}
Run Code Online (Sandbox Code Playgroud)

class Foo
{
    private int m_i;
    private string m_id; 
}
Run Code Online (Sandbox Code Playgroud)

我相信后者来自C++.此外,许多人在成员变量(例如double m_dVal)之前指定类型以指示它是double类型的非常量成员变量?

C#中有哪些约定?

dri*_*iis 61

除了你提到的两个,在C#中很常见的是没有私有成员的前缀.

class Foo
{
    private int i;
    private string id; 
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用的内容,也是Microsoft内部命名准则中的建议.

  • 我更喜欢下划线,因为我只是通过查看名称来了解变量的范围 (25认同)
  • 同意,除了一个例外,当私人会员是公共财产的后备商店时,我个人会先添加一个_字符. (12认同)
  • `i`绝不能用作属性或字段名称.然而,标准做法是使用名为`i`的变量来迭代for循环(甚至是嵌套循环的`j`).我不会这样做的唯一一次是迭代2D/3D网格,在这种情况下我会使用`x`,`y`,`z`. (3认同)
  • 我也总是对属性支持字段使用下划线前缀,因为它很容易犯错误并得到一个...... stackoverflow hur ;) (2认同)
  • 至少在Java中,您可以让编译器在没有"this"的情况下抱怨成员访问.预选赛.我更喜欢"this.x"而不是"_x"(这仍然是暧昧的). (2认同)

Meh*_*ari 14

正如Brad Abrams所述:内部编码指南:

不要使用成员变量的前缀(_,m_,s_等).如果要区分本地变量和成员变量,则应this.在C#中使用" ",Me.在VB.NET中使用" " .

  • @Konrad Radolph:好像他们有一个隐含的*内部*指南:不要使用VB :) (21认同)
  • 我想他们必须这样做。我希望我有一个链接,但我读到了一个建议,建议不要将大小写用作 C# 中保持互操作兼容性的唯一区别因素。 (2认同)
  • @Steve Brouillard:是的。不过,那是针对*public* 成员的。您不应该有两个仅在情况下不同的公共成员。它不符合 CLS。 (2认同)

Bra*_*ery 14

我认为这里的重要原则是你是一致的.如果您喜欢这样做,请使用"_"或"m"前缀,这与您正在使用的其余代码一致.无论你选择什么,坚持下去并保持一致.

  • 阿门.一致性应是唯一需要的标准. (4认同)

Dan*_*fer 10

我更喜欢使用您的第一个示例,或者像这样的自动属性,这样可以避免在您的类中定义私有字段:

public String MyString { get; set; }
Run Code Online (Sandbox Code Playgroud)

使用prop片段使这些真正快速.

  • 您可以通过将set设置为private或protected来使它们"只读":public String MyString {get; 私人集; } (9认同)
  • 除了你不能将自动属性设为只读之外的工作......啊,好吧,也许我会在C#5.0中寻找它. (2认同)
  • 除此之外它们不是精确只读的,类方法仍然可以重置它. (2认同)
  • 类方法也可以设置私有字段......有什么区别? (2认同)
  • 我想@Michael的意思是在课堂外直接不可修改,而不是关键字readonly.在这里工作的英语单词超载.:) (2认同)

AJ.*_*AJ. 7

我从阅读框架设计指南中回忆起,私有成员变量确实没有设置约定,除了一个不应该使用匈牙利表示法,一个不应该大写变量名的第一个字母(使用Camel-casing).书中有引号支持您的两个示例,并且根本不使用任何前缀.

就个人而言,我更喜欢"m_"前缀.


and*_*eer 6

微软的一般指导:

http://msdn.microsoft.com/en-us/library/ms229002.aspx

C#中的自动属性非常好,我可以随时使用,但有些情况下它们对我不起作用,例如在set方法上进行类型或值检查时.

一般情况下:使用驼峰套管,不要在名称前加上下划线或类型前缀等名称.

public int Age {get; set;}
Run Code Online (Sandbox Code Playgroud)

要么

private int age;
public int Age
{
    get { return age; }
    set
    {
        if(value < 0)
            throw new InvalidOperationException("Age > 0");
        age = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不是抛出异常的粉丝是属性getter/setter.但这是一个不同的蠕虫:) (2认同)

ibz*_*ibz 6

最好是使用项目中已经使用的任何东西。如果您开始一个新项目,请使用公司中最常用的任何内容。

  • 如果你创办一家新公司,扔一枚硬币。:) (16认同)

Ale*_*sei 5

我更喜欢用下划线作为私有非 const 非只读字段的前缀。为什么?原因: 1. 只需查看变量,我就可以区分字段变量和本地/参数变量。使用“这个”。不适用于所有字段 - 它更长。2.参数和字段之间存在歧义:

class Foo
{
  private int id;
  public Foo(int id)
  {
    id = id; //Will compile and work fine. But field will not be initialized.
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @MatthijsWessels 有多少地方在构建政策中强制执行 0 警告? (2认同)

Ale*_*oun 5

我个人总是使用你的第一个例子:

    public class Foo
    {
        private int _i;
        private string _id;
    }
Run Code Online (Sandbox Code Playgroud)

事实上,这就是我整个团队所使用的.此外,您提到的那个m_dVal被称为匈牙利表示法,这里是维基百科条目.匈牙利表示法实际上违反了我们团队的编码标准,所以我从不使用它.