【问题标题】:How to declare an optional parameter / default value in C#?如何在 C# 中声明可选参数/默认值?
【发布时间】:2020-09-04 21:30:34
【问题描述】:

我通常在构造函数的参数中声明一个可选参数(默认值),如下所示:

public class XV
{
    public XV(int startPosition = 1) // Constructor
    { 
        this.StartPosition = startPosition;
    }

    public int StartPosition { get; set; } // Property
}

但后来我发现自己正在查看我这样编写的旧代码:

public class XV
{
    public XV( ... ) { ... } // Constructor
    public XV(int startPosition) // Constructor
    { 
        this.StartPosition = startPosition;
    }

    public int StartPosition { get; set; } = 1; // Property
}

与在构造函数中创建可选值相比,将= 1 添加到属性有什么用处?
是否只是为了支持构造函数中不存在的属性的默认值?
但如果是这样,为什么不在这种情况下将它们添加到构造函数中呢?

【问题讨论】:

  • 有些类有很多属性。如果您要将所有属性放入具有默认值的 ctor 中,这可能会变得混乱。此外,如果您只想为最后一个参数指定一个新值,则必须声明它之前的所有参数。
  • 另一个原因是可选参数仅支持“编译时常量”。例如这是非法的public XV(List<int> nums = new List<int>(){1,2,3}),这没问题public List<int> Nums { get; set; } = new List<int>() { 1, 2, 3 };
  • What is the use of adding = 1 to the Property compared to creating an optional value in the Constructor? 因为属性本​​身的默认值适用于所有构造函数。

标签: c# properties default-value optional-parameters


【解决方案1】:

使用optional argument第一种情况),您可以不提供值的情况下调用函数。
new XV(); 将是对带有可选参数的函数。即使您没有定义无参数构造函数。构造函数签名将匹配调用()(int)。事实上,能够将更多调用与一个签名匹配是可选参数的一个重要用例。

请注意,可选参数并非一直存在。它们只是在 C# 4.0 中添加回来的。所以旧代码可能不会使用它,因为那时它根本不是东西。但是对于构造函数,constructor chaining 经常用于定义事实上的默认值。

第二种情况中,只有(int) 调用是有效的。如果您想使用默认值,您必须先检索它。所以这几乎不是我所说的“默认值”。 “可靠初始化”将是一个更好的术语。它确实没用,可能会被编译器和 JIT 完全砍掉。

如果您想要一个无参数构造函数,则必须显式编写代码(类以隐式无参数构造函数开头,但任何显式构造函数都会禁用它)。

【讨论】:

  • 那么“第一种情况”将是首选的方法,对吧?
  • @OlaStröm 对于构造函数,我认为链接仍然是首选。有些语言可能无法使用可选参数,例如 4.0 之前的 C#。通常这些值是您班级的普通用户无法决定的。对于其他所有内容,它都是可选参数。
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多