Соглашение об именах для класса констант в C #: множественное число или единственное число? - PullRequest
19 голосов
/ 01 ноября 2011

Указания понятны для перечислений ...

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

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

Ответы [ 4 ]

25 голосов
/ 01 ноября 2011

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

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

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

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

6 голосов
/ 01 ноября 2011

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

1 голос
/ 01 ноября 2011

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

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

0 голосов
/ 15 апреля 2016

Я бы использовал имя во множественном числе: 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);
    }
}
...