Какую коллекцию C # я должен использовать для этого варианта использования? - PullRequest
0 голосов
/ 11 октября 2010

http://www.dreamincode.net/forums/user/335389-sergio-tapia/

Я группа помощников, в настоящее время есть другие группы.Я хочу записать все возможные группы в класс C # или что-то еще, а затем в будущем, когда будут созданы другие группы, я просто изменю эту «коллекцию групп».

Мой вопрос заключается в том, какую структуру C # мне следуетиспользовать для этого варианта использования?

Редактировать: Изменен вопрос и некоторые части тела для ясности.

1 Ответ

1 голос
/ 11 октября 2010

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

public enum SomeColors
{
  Black,
  blue,
  red
}

Код в другой сборке, скомпилированной для использования SomeColors.blue, сломается, если мы сделаем:

public enum SomeColors
{
  Black,
  Green,
  blue,
  red
}

Поскольку в нем будет скомпилировано значение 1, которое теперь является значением SomeColors.Green, тогда как SomeColors.blue теперь 2.

Кроме того, если бы мы изменили первый, чтобы иметь одинаковую заглавную букву, на:

public enum SomeColors
{
  Black,
  Blue,
  Red
}

Тогда выполнение кода все равно будет работать, но при повторной компиляции будут ошибки компилятора, так как SomeColors.Blue не будет работать. Кроме того, Enum.Parse будет (в этом случае, в зависимости от настройки чувствительности к регистру) работать в зависимости от того, какая версия SomeColors была доступна для работающего кода.

Однако добавление значений не является серьезным изменением. Если мы взяли первое и изменили его на:

public enum SomeColors
{
  Black,
  blue,
  red,
  green
}

Тогда весь существующий код будет в порядке, но, конечно, не будет знать о green, если не найден с Enum.Parse.

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

То же самое относится к const значениям.

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

public static class SomeColors
{
  public static readonly int Black = 0;
  public static readonly int Blue = 1;
  public static readonly int Red = 2;
}

Поскольку это не константы, а поля, назначаемые статически, они будут использоваться из класса, а не скомпилированы, и изменения в классе изменят то, что используется. Дальнейшая безопасность в некоторых случаях может быть обеспечена путем придания им свойств, а не полей; в частности, если вы захотите создать вычисляемые свойства в будущем, это будет серьезным изменением, если они в настоящее время являются полями, но не если они уже являются свойствами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...