.NET: bool по сравнению с перечислением как параметр метода

Каждый раз я пишу метод, который берет булев параметр, представляющий опцию, я думаю: "я должен заменить это перечислением, которое сделало бы чтение вызовов метода намного легче?".

Рассмотрите следующее с объектом, который берет параметр, говорящий, должна ли реализация использовать свою ориентированную на многопотоковое исполнение версию или не (я не спрашиваю здесь, если этим способом сделать это является хороший дизайн или нет, только использование булевской переменной):

public void CreateSomeObject(bool makeThreadSafe);
CreateSomeObject(true);

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

public enum CreationOptions { None, MakeThreadSafe }
public void CreateSomeObject(CreationOptions options);
CreateSomeObject(CreationOptions.MakeThreadSafe);

который описывает намерение намного лучше.

Вещи ухудшаются, когда существует две опции представления булевых параметров. Посмотрите то, что произошло с ObjectContext.SaveChanges(bool) между Платформой 3.5 и 4.0. Это был obsoleted, потому что вторая опция была представлена, и все это было преобразовано в перечисление.

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

7
задан Julien Lebosquain 25 May 2010 в 22:06
поделиться

4 ответа

.NET 4.0 может помочь здесь. Вы можете использовать именованные параметры:

CreateSomeObject(makeThreadSafe : true);

Для старых версий может быть полезно создать временные переменные.

bool makeThreadSafe = true;
CreateSomeObject(makeThreadSafe);
7
ответ дан 6 December 2019 в 19:33
поделиться

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

Если вы работаете в C# 4.0, вы можете использовать именованные параметры, чтобы сделать ваше намерение ясным.

1
ответ дан 6 December 2019 в 19:33
поделиться

Вы можете использовать именованные параметры в C # 4.0:

CreateSomeObject(makeThreadSafe : true);
1
ответ дан 6 December 2019 в 19:33
поделиться

Я думаю, это будет зависеть от семантики ваших методов, например, действительно ли ваше булево значение представляет булево? Или оно используется только для того, чтобы отметить наличие, а не отсутствие другой вещи?

Например:

// If true, uses 64 bit numbers, if false, 32.
doSomething(boolean)

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

Options.Use32Bit,
Options.Use64Bit.
2
ответ дан 6 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: