C # «Постоянные объекты» для использования в качестве параметров по умолчанию - PullRequest
18 голосов
/ 21 марта 2011

Есть ли способ создать постоянный объект (т. Е. Он не может быть отредактирован и создается во время компиляции)?

Я просто играю с языком C # и заметил возможность использования необязательного параметра и подумал, что это можетбыть аккуратным, чтобы иметь возможность использовать объект по умолчанию в качестве необязательного параметра.Рассмотрим следующее:

//this class has default settings
private const SettingsClass DefaultSettings = new SettingsClass ();

public void doSomething(SettingsClass settings = DefaultSettings)
{

}

Это, очевидно, не компилируется, но является примером того, что я хотел бы сделать.Можно ли создать такой постоянный объект и использовать его в качестве значения по умолчанию для необязательного параметра ??

Ответы [ 3 ]

29 голосов
/ 21 марта 2011

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

В вашем случае, обходной путь будет:

public void doSomething(SettingsClass settings = null)
{
    settings = settings ?? DefaultSettings;
    ...
}
4 голосов
/ 21 марта 2011

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

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

public void doSomething()
{
    var settings = // get your settings here any way you like
    this.doSomething(settings);
}

public void doSomething(SettingsClass settings)
{
    // implementation
}

Это работает, даже если параметр является типом значения.

0 голосов
/ 18 ноября 2011

Вы можете использовать атрибут readonly вместо const.Например:

//this class has default settings 
private readonly SettingsClass DefaultSettings = new SettingsClass (); 

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 
} 
...