常量的C#命名约定?


419
private const int THE_ANSWER = 42;

要么

private const int theAnswer = 42;

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


4
@mmiika:此示例中的“ the”是什么意思?是《银河漫游者指南》中的内容,还是从某些C ++编码标准中继承而来?(例如,用于Macintosh的旧C ++框架THINK C [以及后来的Symantec C ++]使用前缀“ its”表示指针/引用成员,使用“ the”表示标量成员。)
Peter Mortensen

5
@Peter,因为常量的值为42,所以我坚信它是对The Hitchhiker's Guide to the Galaxy的引用。
Albireo

@PeterMortensen很有创意!但是像它的雇员和它的宇宙之星这样的名字听起来可能会引起误解。
卡米洛·马丁


我更喜欢theAnswer。以前曾经是匈牙利符号迷,但自从我学会了不使用它以来,我一直喜欢严格避免在命名中使用任何元符号。类似的接口也是如此IInterface。我更喜欢Interfacable。但是在团队中工作时,我必须遵守规则:(
nawfal

Answers:


484

推荐的命名和大小写约定使用P ASCAL Ç ASING常量(微软有一个名为工具了StyleCop该文档中的所有最佳惯例,并可以检查您的来源为合规性-尽管这是一个有点肛门保持了很多人的口味) 。例如

private const int TheAnswer = 42;

Microsoft的《框架设计指南》中也记录了Pascal大写约定。


51
实际上,StyleCop不是“不是Microsoft产品”,而是“由Microsoft的一个非常热情的开发人员(在晚上和周末)开发的工具。” (有关详细信息,请参见blogs.msdn.com/sourceanalysis/archive/2008/07/20/…blogs.msdn.com/bharry/archive/2008/07/19/…)。微软框架的命名就是这样。约定使用Pascal大小写表示常量,因此该工具只是强制执行Microsoft 确实发布和认可的标准。
bdukes

12
@bdukes-我不是说它是Microsoft产品,但是它在整个组织中确实有很多用途和支持(作为前雇员,我使用它已经有很多年了,直到Microsoft以外的任何人都可以使用它,所以我非常了解它的传承)。
格雷格·比奇

8
我不喜欢这样,因为第一个字母通常用于指示变量是否在外部可见。在代码中,TheAnswer在我看来像是公共财产,而不是私有const。我实际上更喜欢使用像constTheAnswer和ConstTheAnswer这样的前缀。
伊芙琳

52
我将使用TheAnswer表示法,除非值是42,在这种情况下,我一定会坚持使用ALL_CAPS方法。
Benoittr 2011年

4
如果是const,是否不应该对私有字段进行驼峰式处理?
Markus Meyer 2013年

70

在外观上,大写字母是必经之路。这样就很容易辨认了。为了唯一,并且没有猜测的机会,我投票支持UPPER_CASE!

const int THE_ANSWER = 42;

注意:如果要在页面顶部的同一文件中使用常量并用于智能目的,则大写字母将很有用。但是,如果要将它们转移到一个独立的类中,则使用大写字母不会有太大的区别,例如:

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;
 }

5
我也更喜欢这样做,因为Pascal大小写很容易与属性引用混淆。
bc3tech

8
不管上面的建议如何,我都更喜欢使用UPPER_CASE作为常量,因为与其他任何情况相比,它更易于识别。
dub stylee 2015年

23
在C#中强烈建议@usefulBee“ SNAKE_CASE”; 这个答案是错误的。C#中const的正确大小写是“ TitleCase”。
BrainSlugs83 '16

13
@ BrainSlugs83,我认为这里没有对与错;它取决于首选项以及使代码更清晰的地方。
有用蜜蜂

2
@usefulBee同意。但是,尽管如此,还是标记一下共识是什么还是很好的。我最近一直在做大量的Ruby代码,我认为SCREAMING_SNAKE_CASE是有意义的:很明显,它很特别,您甚至不需要悬停/转到定义即可了解它的含义。你马上知道。
Per Lundberg

69

其实是

private const int TheAnswer = 42;

至少如果您查看.NET库,那么IMO是确定命名约定的最佳方法-这样您的代码就不会显得格格不入。


23

对于const值,我仍然使用大写字母,但这比出于任何特定原因更不习惯。

当然,可以很容易地立即看到某些东西是常量。我的问题是:我们真的需要这些信息吗?它对我们避免错误有任何帮助吗?如果我给const赋值,编译器会告诉我我做了一些愚蠢的事情。

我的结论是:穿上骆驼衣。也许我也会改变自己的风格;-)

编辑:

国际海事组织(IMO)认为闻到匈牙利味的东西并不是一个有效的论点。问题应该始终是:它有帮助还是有伤?

在某些情况下,匈牙利会提供帮助。如今并不多,但它们仍然存在。


30
读取代码比编写代码要多得多。当然,在编写代码时,编译器将阻止您分配给常量。但是,从现在起两年内必须维护您的代码的那个人呢?能够立即识别一个常数肯定很好。
格雷格(Greg Hewgill)

2
当今的IDE在编译之前会遇到很多问题。我认为按名称识别常量并不重要,否则您是否也不应为只读变量添加一些特殊名称?
mmiika

5
如果您考虑一下,大写的哈比位可能来自预处理程序宏而不是常量(我从未用过真正的常量使用大写上限)。在这种情况下,将宏与实际代码区分开是有意义的,因为宏实际上很可能是表达式而不是常量,它的扩展可能会引起副作用等。因此,您需要知道何时使用宏以及何时使用const。我个人很高兴看到预处理器宏的背面,它们具有使代码难以阅读的巨大潜力。
蒂姆·隆2009年

7
@Tim:我同意,最终预处理器宏带来的弊大于利。我最喜欢的PP宏:“
DEFINE

1
@Tim:C ++标准临时库对常量采用小写形式,例如std :: string :: npos(cplusplus.com/reference/string/string/npos)。因此,ALL_CAPS仅适用于宏和预处理器指令-这使其在C#中显得更加愚蠢。
理查德·丁沃尔

16

首先,匈牙利表示法是使用前缀显示参数的数据类型或预期用途的一种做法。Microsoft的命名约定对匈牙利表示法 http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

如此处所述,不鼓励使用大写字母:Pascal Case是可以接受的约定,并且会增加CAPS。 http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

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

这几乎可以总结一下。


3
是的,匈牙利符号并不大写。
snibbets 2013年

13

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

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;
}

因此,对于常量,似乎 Microsoft建议使用camelCasing。但是请注意,这些常量是在本地定义的。

可以说,外部可见常量的命名引起了更大的兴趣。实际上,Microsoft 在.NET类库中将其公共常量记录为field。这里有些例子:

前两个是的示例PascalCasing。第三个似乎遵循Microsoft的大写约定,使用两个字母的首字母缩写词(尽管pi不是缩写词)。第四点似乎表明,两个字母的缩写的规则扩展到单个字母的缩写或标识符,例如E(代表数学常数e)。

此外,Microsoft在其《大写约定》文档中非常直接地指出,字段标识符应通过命名,PascalCasing并为MessageQueue.InfiniteTimeoutUInt32.Min提供以下示例:

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

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

最后,据我所知,Microsoft不主张针对专用标识符使用特定的命名或大写约定,如问题所显示的示例所示。


撰写该文章的开发人员显然没有遵循Microsoft建议的C#样式约定。
BrainSlugs83 '16

2
该答案指向的文章已更改。const现在是公开的,并且已经被PascalCased了。给定这两个更改,这无助于回答应将私有常量设为PascalCased还是camelCased。
Metalogic

12

将匈牙利人留给匈牙利人。

在这个例子中,我什至省去了权威性的文章,而是

private const int Answer = 42;

那是答案还是那答案?

*严格按照Pascal的观点进行编辑,但是我想这个问题正在寻求更多关于生命,宇宙和万物的答案。


2
在这种特定的情况下,答案。但这只是因为我非常喜欢读D.Adams。
Treb

是的,但是有什么问题?并且不要因为给您带来的不便而感到抱歉;)
鸽子

2
嗯,但是由于您已经知道答案了,所以您不知道问题所在。它们是互斥的。(打赌您已经知道了;-)
Treb

这是对OP问题的正确答案。- The如果可以的话,我会两次投票赞成删除。:-)
BrainSlugs83 '16

匈牙利语是什么人,这个答案是否表示允许他们使用其他约定?
普林尼上尉,

6

我实际上倾向于在这里偏爱PascalCase-但出于习惯,我对UPPER_CASE感到内......


6

我相信,ALL_CAPS来自C和C ++的工作方式。本文在这里解释了样式差异是如何产生的。

在新的IDE(如Visual Studio)中,很容易识别类型,范围以及它们是否为常量,因此并不是必须的。

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

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.