Соглашение об именах для класса констант в С#: множественное или единственное число?

Рекомендации перечислены...

Использовать уникальное имя для перечисления, если его значения не являются битовыми полями.

(Источник: 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";
}

Ответы

Ответ 1

Я бы использовал множественное число: Tokens. Это означает, что статический класс служит в качестве набора элементов определенного типа (типы выполнения которых не относятся к классу).

С другой стороны, поля перечисления являются экземплярами типа перечисления. Например, TypeCode.String является TypeCode. Было бы странно сказать, что TypeCodes.String есть TypeCodes.

Однако в примере Tokens использование единственного числа дает нам Token.Foo, который является токеном, но он не является Token (это string).

(Или, если вы используете множественное имя класса, Tokens.Foo - это string, а не Tokens. Ack!)

Ответ 2

Поскольку оба используются по существу одинаково и концептуально одно и то же, я бы рекомендовал только следовать рекомендациям перечисления.

Ответ 3

У меня нет официального стандарта именования для ссылки, но я могу сказать вам, что я буду делать.

Я бы использовал множественное имя: токены

Ответ 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);
    }
}