Соглашение об именах для класса констант в С#: множественное или единственное число?
Рекомендации перечислены...
Использовать уникальное имя для перечисления, если его значения не являются битовыми полями.
(Источник: 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);
}
}