C#函数参数使用什么命名约定


14

在某些情况下,在Parameter中传递的名称将被转换为新的类型,但是Passed对象的名称应保持相似。对于类属性,我们可以使用此运算符,但是函数中的局部变量呢?什么编码约定被广泛使用。

例,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

或相反

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

或其他任何约定


1
无论其他答案你在下面,有分析和执行谋篇一个小工具:archive.msdn.microsoft.com/sourceanalysis
帕特里克·休斯

Answers:


11

在C#中,用下划线给参数或局部变量加上前缀不是很习惯,它不是很容易阅读并且不经常使用(尽管它是合法的,所以您可以随意这样做)。

参数和变量的最佳名称是描述性名称。您需要考虑为什么要更改类型,什么是强制转换的原因。然后,您应该可以拿出2个不同的名称。例如,您传递了一个“人员”并将其转换为“客户”,则可以在变量名称中使用人员和/或客户。

如果您真的想不出两个不同的名称,那么我会在名称中使用“ as”(几天前此站点上对此存在疑问)。例如,您将“ myParaAsDerived”用作局部变量。

如果可能的话,我将不使用它,我会认真考虑您正在解决的问题以及可以使用哪些有意义的名称,但是如果其他所有方法都失败,则这是很容易理解的。


只是仔细检查一下(我对C#并不熟悉)。前导下划线真的在C#中“合法”合法吗?在C和C ++中,带下划线(或双下划线)的标识符是保留的,因此尽管从某种意义上讲它们是合法的,但您不应像这样定义自己的标识符。csharp.comsci.us/etymology/identifiers.html建议C#可能相似(请参见“限制”的底部),但实际上并未说“保留”。
Steve314 2011年

领先的下属在C#中是完全合法的,并且根据我所知的任何约定都没有保留。
史蒂夫

9

首先使用

void MyFunc(BaseClass _myPara)
{
} 

显然是错误的!由于许多c#编码标准在所有字段名称上都使用“ _”前缀!您的代码必须易于其他程序员理解,因此,不应以会误导许多C#程序员的方式编写代码。

考虑到小型方法的所有优点,我个人认为不需要使用命名约定将局部变量与参数分开。如果您的方法有太多的参数和局部变量,那么在没有命名约定的情况下您无法分辨正在发生的事情,那么您会遇到更大的问题。(这本书在Java 的Clean Code Book中有很好的介绍,但是作为C#程序员,我仍然发现它有很大的好处)


4

如果确实想给它们加上前缀,则应该使用p_参数:通常,我想如果这样做,可能会惹恼很多人。但是要保持一致,不要仅仅因为要使用相同名称的变量而需要两个不同的名称就在一个地方做。

具有可变命名的良好通用规则如下:

  • 如果只有一种类型的对象名称,则按其功能:

    var builder = new PizzaBuilder();
  • 如果您使用他们的功能和专长来命名多个,则:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

参数的p_(或仅p)是一种古老的约定,在C ++和C中已被广泛使用。对于本地变量,它倾向于使用l_;对于成员变量,它倾向于与m_(在C ++中)一起使用。我也曾在Pascal,Modula 2和Ada上看到过它,所以这不仅是C系列产品。这有点爱它或恨-,虽然。我几乎迷恋了它,我的借口是史蒂夫·海格(Steve Haighs)的“ As”推理。例如,setter方法经常这样做m_Whatever = p_Whatever;-给两个标识符有意义的不同名称将是尴尬的。但是我已经开始怀疑这些情况是否足够普遍以证明一致的惯例是正确的。
Steve314 2011年

4

C#命名约定将使您:

  • 使用PascalCasing获取方法,公共属性和类名
  • 使用IPascalCasing(请注意开头的I)作为接口名称
  • 使用camelCasing作为方法参数和局部变量
  • 将_underscoredCamelCasing用于类范围的私有字段

并且请远离匈牙利符号。这是没有意义的,并且不遵守C#约定。


如果私有字段是静态的,则将被Pascal大小写。
萨拉

2

在变量命名中强调一点可能是不必要的,因为我们有“ this”关键字来专门引用类级变量。如果您想从专家那里了解有关变量命名约定的更多信息,建议您看一下由干净的编码导师Robert C. Martin支持的Tim Ottinger的臭名昭著的论文“ Ottinger的变量和类命名规则”。 。

Ottinger指出,您的代码必须像写得好的散文一样,尽可能保持人类可读性,因此...

public void Function(string p_Parameter1, string p_Parameter2)

...将更具可读性,例如...

public void Function(string parameter1, string parameter2)

...其中parameter1和2是相应变量的描述性名称。

这是链接,绝对值得一看:链接


-3

我相信参数后缀:字符串s_,int i_等

我还认为,parm名称应简短且通用。

现在,原因如下:

  • 在函数中,您不想以任何方式修改参数,如果需要修改的版本,请创建一个新变量以将其插入。使用带后缀的parm命名将确保您在付款时不分配给它们注意。
  • 当parm为ref或out时,此规则例外。虽然我仍然在这些上使用后缀。
  • 为什么要缩写通用名称?您应该记录函数,以使您知道s_实际上是描述性的。因此,在创建相似函数组或裁剪函数主体以将其传输到另一个函数作为修改起点时,使用短泛型将很方便。
  • 通用名称的真正好处是,您不必在大多数情况下都调用该参数。您知道您正在获取一个字符串,因此它是s_等,而不必怀疑它是'filename'还是'filepath'还是'fullpath',它是唯一的字符串,因此是's_'。

一切都需要权衡取舍,是否使用某些东西在很大程度上取决于它是否适合您当前的样式。


6
-1:a)您在加前缀而不是后缀;b)这是匈牙利语,应该沿的方式行事。
Peter K.

1
C#类型不安全吗?
pyvi

1
@Peter K.-在我看来,si都是短名称,因为这只是一个例子。IOW我一点都不认为这是匈牙利语-我认为您误解了一个短名称,而该短名称只是经典名称,string s或者int i我想不出一个更好的名称,但是在其后缀了下划线。
Steve314,2011年

@ Steve314:嗯,你可能是对的!让我们看看Mark是否回应。
Peter K.

我猜s_是一个匿名HG,它不是由于示例。
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.