C#“常量对象”用作默认参数

有没有办法创建一个常量对象(即它无法编辑并在编译时创建)?

我只是在玩C#语言并注意到可选参数function,并认为可以将默认对象用作可选参数。 考虑以下:

//this class has default settings private const SettingsClass DefaultSettings = new SettingsClass (); public void doSomething(SettingsClass settings = DefaultSettings) { } 

这显然不能编译,但是我想做的一个例子。 是否可以创建这样的常量对象并将其用作可选参数的默认值?

不,可选参数的默认值需要是编译时常量。

在您的情况下,解决方法是:

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

一般来说你想要的是不可能的。 如Ani的答案所示,您可以使用“无效”默认值伪造它,但如果没有值,您可以将其视为无效。 对于可以将参数更改为可空类型的值类型,这不会是一个问题,但是您将产生装箱并且还可以“稀释”函数的界面以适应实现细节。

如果将可选参数替换为多个重载的前C#4范例,则可以实现所需的function:

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

即使参数是值类型,这也适用。

您可以使用readonly属性,而不是const。 例如:

 //this class has default settings private readonly SettingsClass DefaultSettings = new SettingsClass (); public void doSomething(SettingsClass settings = DefaultSettings) { }