我刚刚发现,将UpperFirstLetterPascalCase()
用于私有方法似乎是一种常见的模式。我自己,发现这与私有实例字段和变量的命名规则完全不一致,我发现它也难以读取/调试。
我想问一下,为什么使用方法的第一个大写字母比第一个低doThis()
更好?只是出于好奇......
答案 0 :(得分:65)
C#中的所有方法名称都按照惯例以大写字母开头。所有属性名称也是如此。只有私有字段,局部变量和方法参数以小写字母(AFAIR)开头。
这是一个惯例所以要求“为什么”有点错位。它可能类似于询问»为什么Java编码约定更喜欢除了类之外的所有内容的小写字母?« - 这些问题的答案通常都是»因为有人在某处决定这样做是个好主意« 。其余的只是历史或惯例,你要么遵循它,要么不遵循它(在这种情况下,你会让人们的生活更难以阅读你的代码)。
ETA:正如评论中已经说过的那样,(imho)回答问题的原因是什么?«通常会导致语言设计者(或者提出会议的人)考虑到是公约所涵盖的重要方面。在Java中,显然是在视觉上区分类(PascalCase),变量/字段(camelCase)和属性(get〜()/ set~())的情况。对于.NET,显然需要立即告诉类和接口(我认为它也很好)和视觉上区分属性(PascalCase)和字段(camelCase)访问。
通常在这种情况下,不的所有事物最初被认为对于约定很重要,但显而易见。
答案 1 :(得分:23)
这不是更好或更糟。这只是惯例。
答案 2 :(得分:7)
这是.NET的命名约定,这是所有标准.NET库遵循的惯例。没有什么要求你在你自己的代码中遵循这个约定,但通常最好遵循你正在使用的语言的标准。就个人而言,我更喜欢lowerCamelCase到UpperCamelCase,但我在编写时仍然使用推荐的.NET风格在C#。
私人成员变量通常用前导下划线和小写首字母表示,例如_privateMember
。私有方法遵循与公共方法相同的约定。
答案 3 :(得分:3)
我能想到的一个区别是它区分了本地委托变量和方法,尽管这可能不是意图。使用现代IDE,无论如何,通常很容易确定呼叫是公共呼叫还是私有呼叫。我对属性,字段和变量的命名约定的看法是它们允许区分同一“属性”的不同形式,如下所示:
public class MyClass
{
private int _property;
public int Property
{
get { return _property; }
}
public MyClass(int property)
{
_property = property;
}
}
使用方法时,如果您希望对同一概念的不同形式使用相同的名称(除了不需要不同外壳来区分它们的重载),则不会产生相同的歧义。
答案 4 :(得分:2)
您从此约定中获得的主要功能是能够轻松区分方法调用与成员变量和参数访问。
正如其他人所提到的,它并不一定更好 - 这只是.NET开发人员选择并坚持的权衡:更容易告诉您正在访问的内容而不是这样可以更容易地告诉您正在访问的内容的可访问性级别。
属性使这一点特别有价值,这可以解释为什么它在.NET世界中扎根。能够区分属性访问和成员变量访问之间的区别至关重要。属性访问器可能正在计算或验证值,并且错误地调用相关成员变量(反之亦然)会产生细微的错误。
答案 5 :(得分:2)
我确实认为你应该根据自己喜欢/不喜欢的方式选择你的命名约定,不管其他人怎么做(当然除非支付支票的人另有说法)。
重要的是:一旦你选择了一个约定,坚持下去!
答案 6 :(得分:1)
我只想指出,虽然是的,PascalCase是.NET中用于私有和公共方法的惯例,考虑到我们在这里谈论私有方法,我看不到选择看起来更好的东西会造成伤害。我的意思是,你确实有一个观点,即区分私人公共方法似乎是有用的。只要你暴露给客户端(如果你正在开发一个库)的内容与约定一致,你就是金色的。只需与任何团队成员一起解决你将如何在内部做事。
答案 7 :(得分:1)
在阅读代码时,我倾向于查看整个方法签名。如果我没有看到访问修饰符(public
,protected
,internal
,protected internal
),那么我可以假设它是private
(尽管我试图成为显式访问修饰符)。
您可以自由采用自己的约定 - 尤其是private
方法。
有一种情况我可以想到约定在哪里有用:使用C#'s implicit method group conversion syntax时。考虑这个课程Test
:
public class Test {
public event EventHandler MyEvent;
}
如果我创建一个私有方法来处理MyEvent
并使用C#的隐式方法组转换语法添加处理程序,则小写方法名称可能会与字段或变量混淆:
Test test = new Test();
test.MyEvent += myEventHandler;
private void myEventHandler(object sender, EventArgs e) {
...
}