常量的C#命名约定?

mmi*_*ika 391 c# const naming-conventions

private const int THE_ANSWER = 42;
Run Code Online (Sandbox Code Playgroud)

要么

private const int theAnswer = 42;
Run Code Online (Sandbox Code Playgroud)

我个人认为在现代IDE中我们应该使用camelCase,因为ALL_CAPS看起来很奇怪.你怎么看?

Gre*_*ech 453

推荐的命名和大写惯例是使用Pascal大小写来表示常量(Microsoft有一个名为StyleCop的工具,它记录了所有首选约定,并且可以检查您的合规性来源 - 虽然它对于许多人的口味有点过于保持).例如

private const int TheAnswer = 42;
Run Code Online (Sandbox Code Playgroud)

Pascal资本化惯例也记录在Microsoft的框架设计指南中.

  • 实际上,StyleCop"不是微软的产品",而是"由微软非常热情的开发人员(晚上和周末)开发的工具." (参见http://blogs.msdn.com/sourceanalysis/archive/2008/07/20/clearing-up-confusion.aspx和http://blogs.msdn.com/bharry/archive/2008/07/19/清理 - confusion.aspx)了解详细信息.)话虽如此,微软的框架命名约定使用Pascal外壳作为常量,因此该工具只是强制执行Microsoft _does_发布和认可的标准. (50认同)
  • 我会使用TheAnswer表示法,除非值为42,在这种情况下,我肯定会坚持使用ALL_CAPS方法. (46认同)
  • @bdukes - 我没有说它是微软的产品,但是它确实在整个组织中有相当多的使用和支持(作为一名前员工,我在微软以外的任何人开始使用它之前几年都使用它,所以我很清楚它的遗产). (12认同)
  • 我不喜欢这样,因为第一个字母通常用于表示变量是否在外部可见.在代码中,TheAnswer看起来像一个公共财产,而不是我的私人const.我实际上更喜欢使用像constTheAnswer和ConstTheAnswer这样的前缀. (7认同)
  • 私人领域不应该是骆驼套装,如果它是常量的事件吗? (4认同)
  • 微软指南说“不要使用大写字母作为字段名称”:https://msdn.microsoft.com/en-us/library/ta31s3bc.aspx (2认同)
  • 对于实例字段来说也是如此.为了命名,常量被认为是静态的.https://msdn.microsoft.com/en-us/library/x2dbyw72.aspx (2认同)

bh2*_*213 67

实际上,它是

private const int TheAnswer = 42;
Run Code Online (Sandbox Code Playgroud)

至少如果你看看.NET库,哪种IMO是决定命名约定的最佳方式 - 所以你的代码看起来不合适.


use*_*Bee 59

在视觉上,大写是走的路.它是如此可识别的方式.为了独特而没有机会猜测,我投票支持UPPER_CASE!

const int THE_ANSWER = 42;
Run Code Online (Sandbox Code Playgroud)

注意:当在页面顶部的同一文件中使用常量并用于智能感知时,大写将很有用; 但是,如果他们被转移到一个独立的班级,使用大写不会有太大的区别,例如:

public static class Constant
{
    public static readonly int Cons1 = 1;
    public static readonly int coNs2 = 2;
    public static readonly int cOns3 = 3;
    public static readonly int CONS4 = 4;
}

// Call constants from anywhere
// Since the class has a unique and recognizable name, Upper Case might lose its charm
private void DoSomething(){
var getCons1 = Constant.Cons1;
var getCons2 = Constant.coNs2;
var getCons3 = Constant.cOns3;
var getCons4 = Constant.CONS4;
 }
Run Code Online (Sandbox Code Playgroud)

  • 强烈建议不要在C#中使用@usefulBee"SNAKE_CASE"; 这个答案是对的.C#中consts的正确案例是"TitleCase". (19认同)
  • @ BrainSlugs83,我觉得这里没有对错; 它归结为偏好以及使代码更清晰的原因. (12认同)
  • 无论上面提出什么建议,我都更喜欢UPPER_CASE用于常量,因为与其他任何情况相比,它更容易识别. (8认同)
  • 我也喜欢这个,因为Pascal外壳很容易与属性引用相混淆. (4认同)
  • @usefulBee同意.但是,尽管如此,仍然很好地标记了什么是_consensus_编写它的方式.我最近一直在做大量的Ruby代码,我认为SCREAMING_SNAKE_CASE是有道理的:很明显它是特别的,你甚至不需要悬停/转到定义来找出它的含义.你马上就知道了. (2认同)

Tre*_*reb 22

我仍然使用大写字母表示const值,但这更多是出于习惯而不是出于任何特定原因.

当然,它很容易立即看出某些东西是一个常量.我的问题是:我们真的需要这些信息吗?它能以任何方式帮助我们避免错误吗?如果我为const赋值,编译器会告诉我我做了一些愚蠢的事.

我的结论:跟骆驼套管一起去.也许我也会改变我的风格;-)

编辑:

国际海事组织,那些闻起来像匈牙利人的东西并不是真正有效的论点.问题应该始终是:它有帮助,还是有害?

有些情况下匈牙利人有帮助.现在不是很多,但它们仍然存在.

  • 代码的读取频率远高于编写代码.当然,当您编写代码时,编译器将阻止您分配常量.但是那个两年后必须维护代码的人呢?能够立即识别常数肯定很好. (28认同)
  • @Tim:我同意,最终预处理器宏带来的弊大于利.我最喜欢的PP宏:"#DEFINE Private Public";-) (7认同)
  • 如果你考虑一下,大写habbit可能来自预处理器宏而不是常量(我从来没有使用块上限来表示真正的常量).在这种情况下,将宏与实际代码区分开是有意义的,因为宏实际上可能是表达式而不是常量值,它的扩展可能会导致副作用等等.因此,您需要知道何时使用宏以及何时使用const.我个人很高兴看到预处理器宏的背面,它们有很大的潜力使代码难以阅读. (4认同)
  • 今天的IDE在编译之前会遇到很多问题.我不认为通过名称识别常量是重要的,否则你不应该为readonly变量添加一些特殊的名称? (2认同)

小智 15

首先,匈牙利表示法是使用前缀来显示参数的数据类型或预期用途的做法.微软的命名惯例是对匈牙利符号说不.http: //en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

不鼓励使用UPPERCASE,如下所述:Pascal Case是可接受的约定和SCREAMING CAPS. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft还在此声明,如果完成匹配现有方案,则可以使用UPPERCASE. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

这几乎总结了它.

  • 是的,匈牙利表示法不是全部大写. (3认同)

dov*_*ove 12

把匈牙利人留给匈牙利人.

在这个例子中,我甚至遗漏了权威的文章,然后就去了

private const int Answer = 42;
Run Code Online (Sandbox Code Playgroud)

答案是答案还是答案?

*编辑Pascal严格正确,但我认为这个问题是寻求更多的生命,宇宙和一切的答案.

  • 在这种特定情况下,它是*答案。但仅仅是因为我非常喜欢阅读 D.Adams。 (3认同)
  • 啊,但既然你已经知道了答案,你就不会知道这个问题.它们是相互排斥的.(打赌你已经知道;-) (2认同)

Dav*_*dRR 12

在其文章常量(C#编程指南)中,Microsoft给出了以下示例:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}
Run Code Online (Sandbox Code Playgroud)

因此,对于常量,似乎微软推荐使用camelCasing.但请注意,这些常量是在本地定义的.

可以说,外部可见常数的命名更受关注.实际上,Microsoft 将.NET类库中的公共常量记录为字段.这里有些例子:

前两个是例子PascalCasing.第三个似乎是遵循微软的资本化公约的两个字母的首字母缩略词(虽然pi不是丙烯酸酯).第四个似乎表明,双字母丙烯酸的规则扩展到单个字母的缩写词或标识符,例如E(代表数学常数e).

此外,在其资本化公约文档中,Microsoft非常直接地声明字段标识符应该通过命名,PascalCasing并为MessageQueue.InfiniteTimeoutUInt32.Min提供以下示例:

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}
Run Code Online (Sandbox Code Playgroud)

结论:PascalCasing用于公共常量(记录为conststatic readonly字段).

最后,据我所知,Microsoft不提倡私有标识符的特定命名或大小写约定,如问题中提供的示例所示.

  • 该答案所指向的文章已更改。这些常量现在是公开的并且已采用 PascalCased。考虑到这两个变化,这无助于回答私有常量应该采用 PascalCased 还是 CamelCased。 (3认同)

Joh*_*ohn 6

ALL_CAPS取自我相信的C和C++工作方式.本文在这里介绍的风格差异是怎么样.

在诸如Visual Studio之类的新IDE中,很容易识别类型,范围以及它们是否恒定,因此并非绝对必要.

FxCop的微软了StyleCop软件将帮助给你指导和检查你的代码,以便每个人都以同样的方式.


Mar*_*ell 6

其实,我倾向于喜欢这里PascalCase - 但出于习惯,我有罪UPPER_CASE的...