С# "Константные объекты" для использования в качестве параметров по умолчанию
Есть ли способ создать постоянный объект (т.е. он не может быть отредактирован и создан во время компиляции)?
Я просто играю на языке С# и замечаю необязательную функцию параметра, и думал, что может быть опционально использовать объект по умолчанию в качестве необязательного параметра. Рассмотрим следующее:
//this class has default settings
private const SettingsClass DefaultSettings = new SettingsClass ();
public void doSomething(SettingsClass settings = DefaultSettings)
{
}
Это, очевидно, не компилируется, а является примером того, что я хотел бы сделать.
Можно ли создать постоянный объект, подобный этому, и использовать его по умолчанию для необязательного параметра
Ответы
Ответ 1
Нет, значения по умолчанию для необязательных параметров должны быть константами времени компиляции.
В вашем случае обходным решением будет следующее:
public void doSomething(SettingsClass settings = null)
{
settings = settings ?? DefaultSettings;
...
}
Ответ 2
Как правило, вы не хотите. Вы можете подделать его с недопустимым значением по умолчанию, как показывает ответ Ani, но это ломается, если нет значения, которое вы можете считать недействительным. Это не будет проблемой для типов значений, где вы можете изменить параметр на тип с нулевым значением, но тогда вы понесете бокс и можете также "размыть" интерфейс функции только для того, чтобы соответствовать деталям реализации.
Вы можете достичь желаемой функциональности, если вы замените необязательный параметр парадигмой pre-С# 4 множественных перегрузок:
public void doSomething()
{
var settings = // get your settings here any way you like
this.doSomething(settings);
}
public void doSomething(SettingsClass settings)
{
// implementation
}
Это работает, даже если параметр является типом значения.
Ответ 3
Вы можете использовать атрибут readonly вместо const. Например:
//this class has default settings
private readonly SettingsClass DefaultSettings = new SettingsClass ();
public void doSomething(SettingsClass settings = DefaultSettings)
{
}