C# 字段命名规范

15

我的教科书(Visual C# How to Program, 6/e)指出,在C#中应使用camelCase命名字段。这与Microsoft C# Guide中给出的示例相符: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/fields

public class CalendarEntry
{
    // private field
    private DateTime date;
    // ...
}

然而,微软的官方命名规则明确指出字段应该使用PascalCase(尽管他们没有提供私有字段的示例,因为通常情况下不需要): https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/capitalization-conventions

标识符:Field, 大小写:Pascal, 示例:

class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

那么,根据微软编码规范,我该如何知道应该使用哪种情况来保持我的编码风格正确?


4
如果你想在微软公司看来保持“正确”,当然要遵循他们的指南。不过你可能会注意到规则随时间而变化,甚至会发现许多例子违反了他们自己的规定。 - Broots Waymb
5
现今在私有领域,我们中的许多人(我希望是大多数人)使用下划线前缀的 _camelCase。当它是一个带有设置器的属性的后备字段时,很容易将 value 错误地打成 Value(无论谁推荐,都可以明显看出 date/Date 的示例不是很好的做法)。对于公共静态的 constreadonly 字段,请使用 PascalCase。公共和私有之间存在很大的区别。 - 15ee8f99-57ff-4f92-890c-b56153
1
@Trioj 或许我只是在看那些知道他们在做什么的人编写的 WPF 代码中经常看到它。由于智能感知不区分大小写,我认为这可能是一个明智的想法。 - 15ee8f99-57ff-4f92-890c-b56153
1
你引用的MS约定中不存在矛盾。私有字段采用驼峰式命名,非私有字段采用帕斯卡式命名。问题在于方法/属性上;私有/非私有区别无法保持一致性,在MS文档中可能会看到各种反例。 - InBetween
1
我知道这个问题会让我的声誉受损,但我得到了我需要的答案,所以感谢大家分享经验。 :) - Igor Nikiforov
显示剩余3条评论
1个回答

35
据我所知,对于c#,目前没有被确立的固定约定......是的,技术上存在一个"官方"约定,但即使在微软自己的源代码中,也并非100%遵循此约定,许多程序员和/或公司显然也不会完全遵循。
考虑到这一点,我的首选约定(也是我迄今为止看到的最好约定)是由ReSharper默认设置的约定。我强烈建议遵循以下约定:
  • PascalCase 用于:类、结构体、方法、属性、public | internal | protected字段(无论static | readonly | const),以及private const字段。
  • _underscorePrefixCamelCase用于:private _fields(除了const)。
  • camelCase 用于:local变量。

@Servy 有点跑题,但既然你显然懂这个东西,能否解释一下区别是什么?根据不同的人所说,field VS variable的语义似乎到处都是。 - CosmicGiant
1
一个“成员变量”可以称之为一个字段。方法中的局部变量不是字段。我不知道C#中是否有任何“local”关键字。 - 15ee8f99-57ff-4f92-890c-b56153
3
这是谷歌搜索结果的前几项,其中包括微软官方文档。毫无疑问,它是正确的(根据定义,在语言的文档中所述的定义就是定义)。我已经浏览了其他一些顶尖搜索结果,并没有发现任何与之相矛盾的地方。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接