Как написать более чистый код при создании экземпляра объекта с перечислениями без использования ключевого слова? - PullRequest
1 голос
/ 30 октября 2009

Я недавно создал класс, у которого есть конструктор, принимающий 3 перечисления в качестве аргументов. Эти перечисления определены в самом объекте как ObjectEnum и AnotherObjectEnum в приведенном ниже примере.

LongObjectName pt = new LongObjectName(
            LongObjectName.ObjectEnum.EnumerationOne,
            LongObjectName.ObjectEnum.EnumerationTwo,
            LongObjectName.AnotherObjectEnum.EnumerationThree,
            0.0);

Мне нужно инициализировать 8 из этих объектов, и я хотел бы сжать это в более ясный формат для будущих кодеров. Я хотел бы структурировать этот код так, чтобы я мог упростить объявление этого объекта - что-то вроде «с» из VB.NET. Я должен был бы реализовать интерфейс IDisposable, чтобы использовать команду "using".

в идеале я бы хотел, чтобы мой код выглядел так:

LongObjectName pt = new LongObjectName( 
                ObjectEnum.EnumerationOne,
                ObjectEnum.EnumerationTwo,
                AnotherObjectEnum.EnumerationThree,
                0.0);

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

Ответы [ 5 ]

10 голосов
/ 30 октября 2009

Вы путаете два использования ключевого слова using.

Вы можете использовать директиву using , чтобы создать псевдоним для любого типа; это не имеет ничего общего с IDisposable.

Например:

using ObjectEnum = YourNamespace.LongObjectName.ObjectEnum;

(Обратите внимание, что все типы в директивах using должны быть полностью дополнены именем пространства имен.


Оператор using не имеет ничего общего с директивой using, кроме имени, и используется для удаления IDisposable.

Например:

using (TransactionScope.BeginTransaction())
using (dataSet)
using (new SqlCommand("SQL", connection) {
    //Do something useful
}
8 голосов
/ 30 октября 2009

Существует простой способ: просто не объявляйте свои перечисления в классе, но в одном и том же пространстве имен класса.

Кстати,

using здесь вам не поможет, так как это ничего не делает, кроме как оборачивает try / finally вокруг вашего кода и вызывает Dispose() в блоке finally. Это ни в коем случае не похоже на VB With.

ETA: Поскольку вы решили принять этот ответ, даже в свете лучших:

Вы можете использовать директиву using для создания псевдонима для вашего перечисления:

using ObjectEnum = SomeNameSpace.LongObjectName.ObjectEnum;

Пожалуйста, проголосуйте за SLaks , а не за меня, так как s? Он был первым, кто предложил эту идею здесь.

4 голосов
/ 30 октября 2009

Конструктивная критика

Если вы действительно хотите конструктивную критику, запустите FxCop для своего кода или Code Analysis, если у вас есть Visual Studio Team Suite.

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


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

2 голосов
/ 30 октября 2009
  1. Добро пожаловать на SO, CrimsonX.
  2. Оператор C # "using" не аналогичен VB "With". Оператор «using» устанавливает область действия объекта перед его удалением, но не инициализирует свойства объекта.
  3. Вы можете рассмотреть возможность создания статических фабричных методов, которые создают экземпляры с использованием общих параметров, таких как «Schedule.NewScheduleSevenDaysAWeek ()» и «Schedule.NewScheduleWeekdaysOnly ()».
  4. Мне кажется, что вы просто пытаетесь сохранить нажатия клавиш. Если это так, то предложение Йоханнесса о переносе списков из класса поможет. В целом, однако, я думаю, что вы найдете C # более многословным, чем VB. Например, C # инициализатор объекта предназначен для более чистого способа создания объектов и установки свойств, но он не короче. Очиститель! = Короче.
1 голос
/ 30 октября 2009

Первым делом первым делом вы можете сделать это:

var pt = new LongObjectName( 
                ObjectEnum.EnumerationOne,
                ObjectEnum.EnumerationTwo,
                AnotherObjectEnum.EnumerationThree,
                0.0);

Во-вторых, вы можете рассмотреть возможность удаления enum из определения класса или создать псевдоним для enum в файле класса вызывающих абонентов.

using ObjectEnum = LongObjectName.ObjectEnum ;
...