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

C#私有成员变量的编码标准,c#,coding-style,C#,Coding Style,我看到了为私有成员变量编码标准的两种常见方法: class Foo { private int _i; private string _id; } 及 我相信后者来自C++。此外,许多人在成员变量之前指定类型(例如,double m_dVal),以表明它是double类型的非常量成员变量 C#?中的约定是什么?我更喜欢使用第一个示例,或者像这样的自动属性,这样可以避免在类中定义私有字段: public String MyString { get; set; } 使用

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

class Foo
{
    private int _i;
    private string _id;     
}

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


C#?

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

public String MyString { get; set; }

使用
prop
snippet可以快速完成这些操作。

除了您提到的两个功能外,在C#中,没有私人成员前缀是非常常见的

class Foo
{
    private int i;
    private string id; 
}
这就是我所使用的,也是在中推荐的。

正如我在阅读中所回忆的,私有成员变量实际上没有设置约定,除了不应使用匈牙利符号和不应大写变量名的第一个字母(使用驼峰大小写)。书中引用了两个例子,并且完全不使用前缀

就我个人而言,我更喜欢“m_”前缀。

如以下所述:

不要为成员使用前缀 变量(
m
s
等)。如果你 想要区分本地和本地 应该使用的成员变量 C#中的“
this.
”和VB.NET中的“
Me.


我倾向于使用第一个约定,一个简单的下划线。我也没有在名称中指定类型,因为我有Intellisense告诉我它是什么(我知道,它可能是一个拐杖)


最好与您的同事或项目团队成员核实一下,然后决定一个约定,其中一些约定是任意的。

我不希望对成员变量使用任何前缀。对于那些在方法外部声明的,我使用“this.memberVariableName”将它们与在方法内部声明的区别开来。

Microsoft的一般指南如下:

C#中的自动属性非常好,我会在可能的情况下使用,但也有一些情况下它们对我不起作用,比如在集合方法上执行类型或值检查时

一般情况下:使用驼峰式大小写,不要在名字前面加下划线或类型前缀

public int Age {get; set;}

privateintage;
公共信息
{
获取{返回年龄;}
设置
{
如果(值<0)
抛出新的InvalidOperationException(“年龄>0”);
年龄=价值;
}
}

我认为这里的重要原则是一致性。如果您喜欢使用“ux”或“m”前缀,并且它与您正在使用的代码的其余部分一致,请使用“ux”或“m”前缀。无论你选择什么,都要坚持并保持一致。

最好的方法是使用项目中已经使用过的东西。如果你开始一个新的项目,使用公司里最常用的任何一种。在开始时,C++标识符中的

< P>被认为是不好的练习,应该留给内部使用。我认为这就是为什么在变量名前面加上35;有时在C中被认为是不好的做法的原因。。。尽管与C/C++标准库不同,您没有理由不能这样做,因为所有的.NET内部都已正确封装。

我更喜欢下划线作为私有非常量非只读字段的前缀。为什么?原因: 1.只要查看变量,我就可以区分字段和局部/参数变量。对所有字段使用“this.”不是一个选项,而是更长的选项。 2.参数和字段之间存在歧义:

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

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

    public class Foo
    {
        private int _i;
        private string _id;
    }

事实上,这就是我整个团队所使用的。此外,您提到的m_dVal被称为匈牙利符号,这里是。匈牙利符号实际上违反了我们团队的编码标准,所以我从不使用它。

同意,除了一个例外,我个人会在私有成员作为公共属性的支持存储时预先添加一个uuu字符。我更喜欢下划线,因为我喜欢通过查看名称来了解变量的范围。我也总是在属性支持字段中使用下划线前缀,因为它很容易出错并获得。。。stackoverflow hur;)至少在Java中,您可以让编译器抱怨没有“this.”限定符的成员访问。我更喜欢“this.x”而不是“x”(这仍然是模棱两可的)。
I
不应该用作属性或字段名。然而,标准做法是使用名为
i
的变量迭代for循环(甚至对嵌套循环使用
j
)。唯一一次我不会这样做是在迭代二维/三维网格时,在这种情况下,我会使用
x
y
z
@Konrad Radolph:似乎他们有一个隐含的内部准则:不要使用VB:)我想他们必须这样做。我希望我有一个链接,但我读到一条建议,不要将case作为C#中唯一的区别因素,以保持互操作兼容性。@Steve Brouillard:是的。不过,这是针对公众成员的。你不应该有两个不同的公众成员,只是以防万一。它不符合CLS。注意到这适用于公共成员和CLS合规性,请加1至@Steve。私人会员有更多的自由。C#或VB.net。其他任何东西都不能直接访问它们。但要确保在整个项目中保持一致。并且总是为下一个接班的人编写代码。@KonradRudolph使用case作为班级成员之间的唯一区别是一种可怕的做法,不管语言是否支持它。如果你开了一家新公司,扔一枚硬币。:)@安德鲁·黑尔(Andrew Hare)并非完全相同,因为我要求的是一般情况,而不仅仅是m_。感谢您指出链接…dupe作为S&A关闭。这个问题是有效的(我可能会补充说,driis的回答非常有帮助)。除了您不能将自动属性设置为只读外,其他都是有效的。。。啊,好吧,也许我会在C#5.0中寻找它。你可以通过将设置为私有或专业设置来将它们设置为“只读”
class Foo
{
  private int id;
  public Foo(int id)
  {
    id = id; //Will compile and work fine. But field will not be initialized.
  }
}
    public class Foo
    {
        private int _i;
        private string _id;
    }