如何在 C# 中声明可选参数/默认值?
How to declare an optional parameter / default value in C#?
我通常在构造函数的参数中声明一个可选参数(默认值),如下所示:
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
添加到 属性 有什么用?
是否仅支持构造函数中不存在的属性的默认值?
但如果是这样,为什么不在那种情况下将它们添加到构造函数中呢?
使用optional argument(第一种情况),您可以调用函数而无需给出值。
new XV();
将是对带有可选参数的函数的有效调用。即使您没有定义无参数构造函数。构造函数签名将匹配调用 ()
和 (int)
。事实上,能够用一个签名匹配更多调用是可选参数的一个重要用例。
请注意,可选参数并非一直存在。它们仅在 C# 4.0 中重新添加。所以旧代码可能不会使用它,因为它在当时根本不是什么东西。但是对于构造函数,constructor chaining 通常用于定义事实上的默认值。
在第二种情况中,只有 (int)
个调用有效。如果您想使用默认值,则必须先 检索 它。所以这几乎不是我所说的 "default value"。 "Reliable initialization" 会是一个更好的术语。它确实没用,可能会被编译器和 JIT 完全删除。
如果您想要一个无参数构造函数,则必须显式编写一个(类 从隐式无参数构造函数开始,但任何显式构造函数都会禁用它)。
我通常在构造函数的参数中声明一个可选参数(默认值),如下所示:
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
添加到 属性 有什么用?
是否仅支持构造函数中不存在的属性的默认值?
但如果是这样,为什么不在那种情况下将它们添加到构造函数中呢?
使用optional argument(第一种情况),您可以调用函数而无需给出值。
new XV();
将是对带有可选参数的函数的有效调用。即使您没有定义无参数构造函数。构造函数签名将匹配调用 ()
和 (int)
。事实上,能够用一个签名匹配更多调用是可选参数的一个重要用例。
请注意,可选参数并非一直存在。它们仅在 C# 4.0 中重新添加。所以旧代码可能不会使用它,因为它在当时根本不是什么东西。但是对于构造函数,constructor chaining 通常用于定义事实上的默认值。
在第二种情况中,只有 (int)
个调用有效。如果您想使用默认值,则必须先 检索 它。所以这几乎不是我所说的 "default value"。 "Reliable initialization" 会是一个更好的术语。它确实没用,可能会被编译器和 JIT 完全删除。
如果您想要一个无参数构造函数,则必须显式编写一个(类 从隐式无参数构造函数开始,但任何显式构造函数都会禁用它)。