C # Статический класс против структуры для предопределенных строк - PullRequest
48 голосов
/ 08 февраля 2010

Сотрудник только что создал следующую конструкцию в C # (пример кода упрощен). Его целью было сократить нотацию для всех предопределенных строк в остальной части кода.

public struct PredefinedStrings
{
    public const string VeryLongName = "Very Long Name";
    public const string AnotherVeryLongName = "Another Very Long Name";
    public const string TheLastVeryLongName = "The Last Very Long Name";
}

public static void MethodThatUsesTheNames()
{
    Console.WriteLine(PredefinedStrings.VeryLongName);
    Console.WriteLine(PredefinedStrings.AnotherVeryLongName);
    Console.WriteLine(PredefinedStrings.TheLastVeryLongName);
}

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

Какой предпочтительный способ сделать это? Пожалуйста, объясните, почему.

Ответы [ 13 ]

0 голосов
/ 26 января 2017

Простой факт, что вам разрешено создавать новый объект, который должен быть константой, является явным свидетельством плохой практики (обычно). Я говорю «обычно», потому что .NET иногда использует эту концепцию, хотя неясно, почему.

Конечно, вы всегда можете сделать что-то вроде этого:

public class Foo
{
    public struct Bar
    {
        public static double A = 100;

        public Bar(double a)
        {
            A = a;
        }
    }
}

Что технически оправдывает создание Bar; однако нет никакой гарантии, что константа Bar будет когда-либо одинаковой (даже в однопоточной среде) и в конечном итоге будет малопригодной.

0 голосов
/ 08 февраля 2010

Я тоже использую структуры для констант, но только для внутреннего использования, а не для публичных API. Это естественно, так как перечисления также преобразуются в структуры.

0 голосов
/ 08 февраля 2010

В моей практике для этой цели мы используем Dictionary<enumNameType, string>.Где enumNameType - это другой тип имен, которые вы можете иметь (в вашем случае) ... Этот словарь помещается в статический класс и кэшируется - мы создаем его только при первом использовании, а затем возвращаем тот же объект ...

Надеюсь, это будет полезно и вам!

...