2011-11-01 98 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); 
    } 
}