c# - 如何在 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
与在构造函数中创建可选值相比,添加到属性有什么用?
只是为了支持构造函数中不存在的属性的默认值吗?
但如果是这样,为什么不在这种情况下将它们添加到构造函数中呢?
解决方案
使用可选参数(第一种情况),您可以在不提供值的情况下调用该函数。
new XV();
将是对带有可选参数的函数的有效调用。即使您没有定义无参数构造函数。构造函数签名将匹配调用()
和(int)
. 事实上,能够将更多调用与一个签名匹配是可选参数的一个重要用例。
请注意,可选参数并非一直存在。它们只是在 C# 4.0 中添加回来的。所以旧代码可能不会使用它,因为那时它根本不是东西。然而,对于构造函数,构造函数链接通常用于定义事实上的默认值。
在第二种情况下,只有(int)
调用是有效的。如果要使用默认值,则必须先检索它。所以这几乎不是我所说的“默认值”。“可靠初始化”将是一个更好的术语。它确实没用,可能会被编译器和 JIT 完全删除。
如果您想要一个无参数构造函数,则必须显式编写代码(类以隐式无参数构造函数开头,但任何显式构造函数都会禁用它)。
推荐阅读
- azure-cdn - 在 Azure CDN 上调用方法 HEAD 是否也会缓存实际资源?
- laravel - Laravel SQLSTATE[HY000] 验证错误
- python - 源代码的圆类中用于半径的测量单位是什么:matplotlib.patches
- c++ - Boost 矩阵的 iterator1 和 iterator2 是什么以及如何使用?
- reactjs - 对于下面给出的代码,状态值(在 Test2.js 上)在 react-native 中没有改变
- omnet++ - 有没有办法在 Omnet 上嗅探/侦听单播数据包/消息?
- php - 将 Magento 升级到 2.2.8 期间的 PHP 扩展问题
- mysql - MySQL多列Sum()在不同/多行中
- emacs - emacs helm:有什么方法可以让它服从模板颜色?
- function - Julia中带参数的映射函数