Рекомендуется ли добавлять все перечисления C # к «Enum», чтобы избежать конфликтов имен? - PullRequest
15 голосов
/ 28 мая 2009

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

public SaveStatus SaveStatus { get; set; }

Кажется, что принятый ответ предлагает использовать "State" для перечисления и "Status" для свойства:

public SaveStatus SaveState { get; set; }

Но я думаю, что это трудно прочитать и не сразу понятно, что к чему.

Поскольку эта проблема с именами enum является постоянной, я рассматриваю просто всегда добавлять суффиксы к enum к «Enum», поэтому у меня будет следующее:

public SaveStatusEnum SaveStatus { get; set; }

SaveStatus = SaveStatusEnum.Succeeded;

Кто-нибудь делает это? Доволен этим? Решил эту проблему по-другому?

Ответы [ 7 ]

22 голосов
/ 28 мая 2009

Со страницы MSDN для рекомендаций по присвоению имен свойств :

Рассмотрите возможность создания свойства с тем же именем, что и его базовый тип. Например, если вы объявляете свойство с именем Color, тип свойство также должно быть Color.

Я бы воспринял это как "нет":)

Изменить:

Если вам не нравится использовать полное имя внутри класса, который объявляет свойство, вы можете обойти его:

using SaveStatusEnum = MyNamespace.SaveStatus;
...
SaveStatus = SaveStatusEnum.SomeValue;

Таким образом, вы можете оставить имя перечисления без суффикса и ограничить странность именования только одним классом. :)

6 голосов
/ 28 мая 2009

Рекомендации Microsoft по именованию .NET не дают такой рекомендации.

Почему бы вам не называть перечисления и свойства одинаковыми именами? Это:

public SaveStatus SaveStatus { get; set; }

отлично работает, легко читается, легко обнаруживается и используется.

6 голосов
/ 28 мая 2009

.NET Framework использует Enum в качестве суффикса? Нет. Вот почему я тоже им не пользуюсь.

Вместо этого я использую такие слова, как Option (или Options, если это Flags-Enum), Mode или подобное.

public SaveStatusMode SaveStatus { get; set; }
public SaveStatusOption SaveStatus { get; set; }
public SaveStatusVariant SaveStatus { get; set; }
4 голосов
/ 28 мая 2009

Некоторые суффиксы используются для некоторых типов классов, таких как xxxException и xxxAttribute, но суффиксы широко не используются. Например, класс, реализующий IEnumerable, не называется MyListEnumerableClass, а просто MyList.

Вместо того, чтобы придумывать стандартный суффикс, который загромождает имена, попробуйте составить имена, которые имеют смысл в конкретной ситуации.

1 голос
/ 08 сентября 2009

Я знаю, что мое предложение идет вразрез с соглашениями об именах .NET, но я лично префикс enum с 'E', а флаги enum с 'F' (аналогично тому, как мы префиксируем интерфейсы с 'I'). Я действительно не понимаю, почему это не конвенция. Enums / Flags - это особый случай, такой как Interfaces, который никогда не изменит своего типа. Мало того, что он дает понять, что это такое, очень просто ввести intellisense, поскольку префикс будет фильтровать большинство других типов / переменных / и т. Д., И у вас не будет этих конфликтов имен.

И это также решило бы другую проблему, когда для примеров в WPF они используют статические классы, такие как enums (например, FontWeights), которые имеют предопределенные экземпляры типов, но вы не узнаете, если не будете искать их. Если бы они просто добавили им префикс «E», все, что вам нужно было бы сделать, это набрать символ, чтобы найти эти специальные статические классы.

1 голос
/ 28 мая 2009

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

0 голосов
/ 22 декабря 2014

Я рекомендую руководящие принципы MS. И это всегда некрасиво кодировать, читать что-то вроде 'FooEnum' в коде;)

...