设置 C# 可选参数的默认值

Posted

技术标签:

【中文标题】设置 C# 可选参数的默认值【英文标题】:Setting the default value of a C# Optional Parameter 【发布时间】:2011-02-13 08:26:07 【问题描述】:

每当我尝试将可选参数的默认值设置为资源文件中的某些内容时,我都会收到

的编译时错误

“消息”的默认参数值必须是编译时常量。

有什么方法可以改变资源文件的工作方式来实现这一点?

public void ValidationError(string fieldName, 
                            string message = ValidationMessages.ContactNotFound)

其中ValidationMessages是一个资源文件。

【问题讨论】:

【参考方案1】:

不,您将无法使资源直接在默认情况下工作。您需要做的是将默认值设置为 null 之类的值,然后当参数在方法体中具有默认值时进行资源查找。

【讨论】:

这就是我害怕的。我真的很喜欢它告诉开发人员字符串将是什么的开发时便利性:jaxidian.org/optparam.jpg 我意识到我所要求的(编译资源文件)杀死了它存在的部分原因,但我正在使用它不是用于本地化和动态更改,而是用作重用字符串的公共存储。【参考方案2】:

一种选择是设置默认值null,然后适当地填充:

public void ValidationError(string fieldName, string message = null)

    string realMessage = message ?? ValidationMessages.ContactNotFound;
    ...

当然,这仅在您不希望将 null 作为真实值时才有效。

另一个可能的选择是有一个预构建步骤,它根据资源创建一个包含const 字符串的文件;然后你可以引用这些常量。不过这会很尴尬。

【讨论】:

这就是我害怕的。我真的很喜欢它告诉开发人员字符串将是什么的开发时便利性:jaxidian.org/optparam.jpg 我意识到我所要求的(编译资源文件)杀死了它存在的部分原因,但我正在使用它不是用于本地化和动态更改,而是用作重用字符串的公共存储。【参考方案3】:

另一种选择是将您的方法一分为二,让一个重载调用另一个,如下所示:

public void ValidationError(string fieldName)
 
    ValidationError(fieldName, ValidationMessages.ContactNotFound);


public void ValidationError(string fieldName, string message)

    ...

这种方式还允许您将null 作为message 的值传递,以防这也是该参数的有效值。

【讨论】:

以上是关于设置 C# 可选参数的默认值的主要内容,如果未能解决你的问题,请参考以下文章

C# 参数可选特性

C# 4.0:我可以使用 TimeSpan 作为具有默认值的可选参数吗?

C#基础 可选参数调用params无参静态构造函数

mongoDB - Collation

C#4.0中的更改——命名参数和可选参数

Dart语法之可选参数