【问题标题】:How to use Environment.NewLine as an optional parameter default value如何使用 Environment.NewLine 作为可选参数默认值
【发布时间】:2019-05-19 08:02:37
【问题描述】:

我更喜欢Environment.NewLine 而不是"\r\n",即使这个项目是仅限Windows 的。我想知道是否有办法将它用作可选参数的默认值。

考虑扩展方法

public static string ToSummaryString<T>(
    this IEnumerable<T> items, 
    string delimiter = Environment.NewLine)

以及编译时错误

'delimiter' 的默认参数值必须是编译时常量

我也尝试过使用参数属性,命运相似

public static string ToSummaryString<T>(
    this IEnumerable<T> items, 
    [Optional, DefaultParameterValue(Environment.NewLine)] string delimiter)

属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式

那么有什么解决方法吗?还是我唯一的选择是将其硬编码为"\r\n",或使其成为必需?

【问题讨论】:

  • 参数为null时,能否将null作为默认值,在方法内部切换到Environment.NewLine
  • 你总是可以用“老办法”来做:写2个方法;一个有分隔符,一个没有。

标签: c# optional-parameters compile-time-constant


【解决方案1】:

您可以用Null 替换您的默认值,然后在您的方法中使用null-coalescing operator。像这样的:

public static string ToSummaryString<T>(this IEnumerable<T> items, string delimiter = null)
{
    var realDelimiter = delimiter ?? Environment.NewLine;
}

作为替代,你也可以使用Method-Overloading,正如@Dennis_E 也提到:写2个方法;一个有分隔符,一个没有

【讨论】:

    【解决方案2】:

    在我看来,最好的方法是让默认值为 null,然后在方法中检查该值。如果参数为空,则将默认值设置为“\r\n”。更好的是,将该默认值保存在资源文件中,以便您可以根据需要更改它,而无需重新编译应用程序。 (当然,将值放在配置文件中也可以)

    【讨论】:

    • 配合一些好的 XML 文档来帮助进行智能感知,这可能会起作用,即/// &lt;param name="delimiter"&gt;Default value is really Environment.NewLine&lt;/param&gt;。但是,如果默认值是可配置的,那么评论就会崩溃,但这无论如何都超出了我的问题范围。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多