2011-11-01 97 views
15

指导方针是明确的枚举...C#中常量类的命名约定:复数还是单数?

不要使用单一名称的枚举,除非它的值是位域。

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

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

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"; 
} 
+0

想一想,如果你正在创建一个类来保存扩展方法,你会给它一个单数还是复数的名字?也想想其他方法,只是持有对特定值/实例的引用。例如“颜色”。 –

+4

对于它的价值,Windows本身似乎使用复数:[System.Windows.Media.Brushes](http://msdn.microsoft.com/en-us/library/system.windows.media.brushes.aspx) ,[System.Windows.Media.Colors](http://msdn.microsoft.com/en-us/library/system.windows.media.colors.aspx)。 –

+1

@RaymondChen并不总是;例如'System.Drawing.Color'采取相反的方法。 - 有时WPF类似乎在命名时会出现奇怪的现象。 – BrainSlugs83

回答

22

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

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

然而,在你的Tokens例如,使用单数给我们Token.Foo,这令牌,但它不是一个Token(它是一个string)。

(或者,如果您使用复数类名,Tokens.Foostring,而不是一个Tokens确认!)

+1

+1。我喜欢你的推理。 – devuxer

+1

+1。我喜欢采取同样的常识来处理这种情况。在指定任何内容时,我确保它在对话中是可以发音和可用的,因为很有可能在某一点或另一个点上将它传达给另一个开发者。虽然在我们如何命名事物方面存在“标准”,但总有一些特殊情况可能会导致偏离标准。 –

1

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

我会使用复数名称:令牌

+0

我应该注意到我经常打破枚举的命名指南,并将它们命名为复数。我觉得这很自然。 –

6

由于两个基本上采用同样的方式,并在概念上是同样的事情,我只是建议以下枚举准则。

+1

单数名称+1。当编写静态类(这是一个带有Tokens Foo,Bar等的容器)时,恕我直言复数是有意义的,而单数在使用静态类时有意义(使用Token Foo做某事)。 由于第二种情况(使用令牌)远远超过第一种情况(定义令牌),所以单数更合适。 –

0

我会使用复数名称: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); 
    } 
}