C# 中常量类的命名约定:复数还是单数?

Posted

技术标签:

【中文标题】C# 中常量类的命名约定:复数还是单数?【英文标题】:Naming convention for class of constants in C#: plural or singular? 【发布时间】:2011-11-01 00:33:27 【问题描述】:

列举的指南很明确...

对枚举使用单数名称,除非它的值是位域。

(来源:http://msdn.microsoft.com/en-us/library/ms229040.aspx)

...但对于一类常量(或只读静态字段/属性)不是很清楚。例如,这个类的名称应该是单数还是复数?

public static class Token // or Tokens?

    public const string Foo = "Foo";
    public const string Bar = "Bar";
    public const string Doo = "Doo";
    public const string Hicky = "Hicky";

【问题讨论】:

考虑一下,如果你正在创建一个类来保存扩展方法,你会给它一个单数还是复数名称?还要考虑其他仅包含对特定值/实例的引用的方法。例如,Colors. 不管怎样,Windows 本身似乎使用复数形式:System.Windows.Media.Brushes、System.Windows.Media.Colors。 @RaymondChen 并非总是如此;例如System.Drawing.Color 采取相反的方法。 -- 似乎 WPF 类有时会在命名方面做一些奇怪的事情。 @RaymondChen 还要考虑 System.Windows.Media.DashStyle 与 System.Windows.Media.DashStyles。在这里,后者是前者的预定义集合。 【参考方案1】:

我会使用复数形式:Tokens。这意味着静态类充当某种项目的集合(其运行时类型不是类的类型)。

另一方面,枚举的字段是枚举类型的实例。例如,TypeCode.String TypeCode。说TypeCodes.StringTypeCodes 会很奇怪。

但是,在您的Tokens 示例中,使用单数会得到Token.Foo,它一个标记,但它不是Token(它是string)。

(或者,如果您使用复数类名,Tokens.Foostring,而不是 Tokens。Ack!)

【讨论】:

+1。我喜欢对这种情况采用同样的常识性方法。在命名任何东西时,我会确保它在对话中是可发音和可用的,因为很有可能在某一时刻,它可能需要传达给另一位开发人员。虽然我们命名事物的方式有“标准”,但总有一些特殊情况可能会导致偏离规范。【参考方案2】:

由于两者的使用方式基本相同,并且在概念上是相同的东西,我建议只遵循枚举指南。

【讨论】:

+1 表示单数名称。恕我直言,在编写静态类时复数是有意义的(这是一个带有 Token Foo、Bar 等的容器),而在使用静态类时单数是有意义的(用 Token Foo 做一些事情)。因为第二种情况(使用标记)应该远远超过第一种情况(定义标记),所以单数更合适。【参考方案3】:

我没有任何官方命名标准可以链接,但我可以告诉你我会做什么。

我会使用复数名称:Tokens

【讨论】:

我应该注意,我也经常打破枚举的命名准则并将它们命名为复数。这对我来说感觉更自然。【参考方案4】:

我会使用复数名称:Tokens

但是,您可以考虑创建一个 Token 类来保存 const 值。

这类似于System.Windows.Media.Colors,例如Colors.Blue 返回一个 System.Windows.Media.Color 实例。

public class Token

    public Token(string value)
    
        Value = value;
    

    public string Value  get; private set; 

    public static implicit operator string(Token token)
    
        return token == null ? null : token.Value;
    

    public bool Equals(string value)
    
        return String.Equals(Value, value);
    

    public override bool Equals(object obj)
    
        var other = obj as Token;
        if (other == null)
        
            return false;
        

        return Equals(other.Value);
    

    public override int GetHashCode()
    
        return Value.GetHashCode();
    

    public override string ToString()
    
        return Value;
    


public static class Tokens

    public static readonly Token Foo = new Token("Foo");


class Program

    static void Main(string[] args)
    
        // You can use it as if they were string constants.
        string token = Tokens.Foo;
        bool areEquals = String.Equals(token, Tokens.Foo);
    

【讨论】:

以上是关于C# 中常量类的命名约定:复数还是单数?的主要内容,如果未能解决你的问题,请参考以下文章

java编程中,写一个工具类,命名时使用单数util还是使用复数utils好呢?

C#类命名约定:是基类还是基于类还是抽象类

命名局部常量:UpperCamelCase 还是 lowerCamelCase?

PHP的'命名空间:控制器或控制器,模型还是模型?

在 Ruby on Rails 中测试一个单词是单数还是复数

parent是单数还是复数