What is the purpose of private parameterless constructor in C#
我刚刚收到了乔恩·斯基特在邮件中的深度访谈,但我没有按照第7-8页的讨论进行。
0
我不清楚基于属性的初始化如何需要无参数的构造函数,如果这就是"为了"的含义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Product
{
public string Name { get; private set;}
public decimal Price { get; private set;}
public Product (string name, decimal price)
{
Name = name;
Price = price;
}
Product(){}
.
.
.
} |
Product(){}的目的是什么?
此代码:
1
| Product p = new Product { Name ="Fred", Price = 10m }; |
相当于:
1 2 3 4
| Product tmp = new Product();
tmp.Name ="Fred";
tmp.Price = 10m;
Product p = tmp; |
所以无参数构造函数仍然是必需的——它只从示例代码中的类内部调用,所以它可以是私有的。
这并不是说所有的对象初始值设定项都需要无参数的构造函数。例如,我们可以有:
2
然后像这样在任何地方使用:
1
| Product p = new Product("Fred") { Price = 10m }; |
当然,这本书后面会有更多的细节(第8章IIRC)。
- 乔恩,谢谢你的答复。因此,将隐式"幕后"调用私有构造函数。
- @蒂姆:是的,没错。即使在无参数的情况下,也可以将其显式化:new Product() { Name = ..., Price = ... };。
- 如果没有定义/实现私有的无参数构造函数,会发生什么?
- @用户1767754:然后,根据上一个示例,您必须始终在对象初始值设定项中指定构造函数参数。
- 你好,我刚买了你的书,还有一点事。我已经用无参数构造函数粘贴了您的代码,而vs仍然说我不能使用初始化。因为它看不到私有构造函数,它希望我在初始化属性之前使用带有参数的构造函数。也许我理解错误?
- @Rafal_Koscinski:本书中的示例从同一类中调用构造函数,这是有效的。如果要从该类的源代码之外调用构造函数,则需要将该构造函数设置为内部的或公共的。
- 感谢您的快速回答。您在上面表明,这样做是为了我们可以这样做:产品P=新产品name="fred",价格=1000万;但当我们这样做时,vs告诉我们不能,因为构造函数是私有的。对不起,我有点困惑。当然,如果我希望它在代码之外使用,我应该将其设置为私有的,但在该构造函数的类中看不到这种用法。我看到的一件事是用带有参数的构造函数初始化的列表:(
- @Rafal ou Koscinski:恐怕我发现很难分析你的评论。您引用的代码正在调用一个无参数构造函数,因此只有当调用代码可以访问无参数构造函数时,才能使用它。在我提供的示例代码中,构造函数只在类本身中使用,因此它可以是私有的。
- 啊哈哈,现在我明白了!!!!!!!!你使用它,这样你就可以在类内做类似的事情:新产品name="something",price=something。我的观点是错误的。如果您没有这个,您将不得不在方法中使用"点"初始值设定项,这是正确的吗?
- @Rafal_Koscinski:我不确定"在点初始值设定项的方法中"是什么意思-如果你是指显式设置属性,那么是的。
- 是的,我的意思是;)感谢你,我从长远的角度来看待这个问题,我发现了很多;)是的,这就是我的意思。非常感谢斯基特先生花了这么多时间:)在此致辞中,我祝你圣诞快乐,新年快乐:)