【问题标题】:C# "Constant Objects" to use as default parameters用作默认参数的 C#“常量对象”
【发布时间】:2011-03-21 00:18:52
【问题描述】:

有什么方法可以创建一个常量对象(即不能编辑,是在编译时创建的)?

我只是在玩 C# 语言并注意到可选参数功能,并认为能够使用默认对象作为可选参数可能很简洁。考虑以下几点:

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

public void doSomething(SettingsClass settings = DefaultSettings)
{

}

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

【问题讨论】:

  • 顺便说一句:避免仅仅因为可以使用语言功能。使用它们,因为它们是工作的正确工具。默认参数不是您想要做的正确工具。干杯!
  • 如果这是 Python,这将是完全可以接受的默认参数使用。我认为默认参数没有理由不适合这项工作(除了它在 C# 中无效)。

标签: c# constants optional-parameters


【解决方案1】:

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

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

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

【讨论】:

  • 除非你想让null做一些非默认的事情。
  • 这是一个很好的解决方案...从未见过??之前...null 合并大声笑...当您认为您知道 C#...
  • 我不确定哪个版本允许这个,但你可以在最新的 C# 上转换成这个:settings ??= DefaultSettings;
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 同意,但我正在寻找可选参数方法。
  • @user623879:我添加了一个新的第一段,这使得答案更完整。
  • @User:真的没关系;在这种情况下,参数也是可选的。恕我直言 Jons 方法无疑优于 Anis。
  • 你可能是对的,从软件设计的角度来看这是更好的方法,这就是我最初打算这样做的方式,但我的问题是关于可选参数等,所以我接受了 Anis 的答案。
  • @user623879:我更关心你实际使用的解决方案,而不是你接受谁的答案:)
【解决方案3】:

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

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

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 
} 

【讨论】:

  • 这似乎无法编译。
  • 不起作用,readonly != const, const 在编译时评估,而 readonly 将在运行时评估。 const 将被内联,而 readonly 不会
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2021-09-09
  • 2020-02-15
  • 2011-03-10
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多