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

use*_*879 19 c# const optional-parameters

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

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

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

public void doSomething(SettingsClass settings = DefaultSettings)
{

}
Run Code Online (Sandbox Code Playgroud)

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

Ani*_*Ani 30

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

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

public void doSomething(SettingsClass settings = null)
{
    settings = settings ?? DefaultSettings;
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定哪个版本允许这样做,但您可以在最新的 C# 上转换为:`settings ??= DefaultSettings;` (3认同)

Jon*_*Jon 5

一般来说,你想要的东西是不可能的。正如 Ani 的回答所示,您可以使用“无效”默认值来伪造它,但是如果没有您可以认为无效的值,则此方法会失效。这对于值类型来说不是问题,您可以将参数更改为可空类型,但是您将招致装箱并且也可能“稀释”函数的接口以适应实现细节。

如果将可选参数替换为多个重载的 pre-C# 4 范式,则可以实现所需的功能:

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

public void doSomething(SettingsClass settings)
{
    // implementation
}
Run Code Online (Sandbox Code Playgroud)

即使参数是值类型,这也有效。