Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 私有无参数构造函数,用于新的基于属性的初始化_C# - Fatal编程技术网

C# 私有无参数构造函数,用于新的基于属性的初始化

C# 私有无参数构造函数,用于新的基于属性的初始化,c#,C#,我在《深度》一书中读到: 私有无参数构造函数用于新的基于属性的初始化。在下面的示例中,我们实际上可以完全删除公共构造函数,但是没有外部代码可以创建其他产品实例 使用System.Collections.Generic; 类产品 { 公共字符串名称{get;private set;} 公共十进制价格{get;private set;} 公共产品(字符串名称,十进制价格) { 名称=名称; 价格=价格; } 乘积(){} 公共静态列表GetSampleProducts() { 返回新列表 { 新产品

我在《深度》一书中读到:

私有无参数构造函数用于新的基于属性的初始化。在下面的示例中,我们实际上可以完全删除公共构造函数,但是没有外部代码可以创建其他产品实例

使用System.Collections.Generic;
类产品
{
公共字符串名称{get;private set;}
公共十进制价格{get;private set;}
公共产品(字符串名称,十进制价格)
{
名称=名称;
价格=价格;
}
乘积(){}
公共静态列表GetSampleProducts()
{
返回新列表
{
新产品{Name=“西区故事”,价格=9900万},
新产品{Name=“刺客”,价格=1499万},
新产品{Name=“Frogs”,价格=1399m},
新产品{Name=“Sweeney Todd”,价格=1099万美元}
};
}
公共重写字符串ToString()
{
返回string.Format(“{0}:{1}”,名称,价格);
}
}
但是,如上所述,我能够创建像这样的新对象

List<Product> ls = Product.GetSampleProducts();
            Product o = new Product("a",2);
            ls.Add(o);
            listBox1.DataSource = ls;
List ls=Product.GetSampleProducts();
产品o=新产品(“a”,2);
ls.加入(o);
listBox1.DataSource=ls;

实际上没有私有的无参数构造函数。有人能给它点颜色吗?

你可以这样初始化对象:

 Product o = new Product( "a" , 2);
因为它没有调用无参数构造函数。为什么

不带参数的构造函数称为无参数构造函数或默认构造函数 构造器。无论何时调用对象,都会调用默认构造函数 通过使用
new
运算符实例化,并且不支持任何参数 向新用户提供

上面的代码调用
公共产品(字符串名称,十进制价格)
构造函数,正如您所看到的public

毕竟,作者谈到了新的基于属性的初始化。这意味着:

Product product = new Product { Column1 = "col1", Column2 = "col2" };
当初始化这样的对象时,将首先调用公共无参数构造函数

上面的代码只是一个语法糖:

Product product = new Product(); // Compiler error in outside while default constructor is private
product.Column1 = "col1"; // Compiler error in outside while the set accessor is private
product.Column2 = "col2"; // Compiler error in outside while the set accessor is private

您可以这样初始化对象:

 Product o = new Product( "a" , 2);
因为它没有调用无参数构造函数。为什么

不带参数的构造函数称为无参数构造函数或默认构造函数 构造器。无论何时调用对象,都会调用默认构造函数 通过使用
new
运算符实例化,并且不支持任何参数 向新用户提供

上面的代码调用
公共产品(字符串名称,十进制价格)
构造函数,正如您所看到的public

毕竟,作者谈到了新的基于属性的初始化。这意味着:

Product product = new Product { Column1 = "col1", Column2 = "col2" };
当初始化这样的对象时,将首先调用公共无参数构造函数

上面的代码只是一个语法糖:

Product product = new Product(); // Compiler error in outside while default constructor is private
product.Column1 = "col1"; // Compiler error in outside while the set accessor is private
product.Column2 = "col2"; // Compiler error in outside while the set accessor is private

基于属性的初始化要求存在无参数构造函数。正如@farhad jabiyev已经正确指出的,基于属性的初始化

Product product = new Product { Name = "West Side Story", Price = 9.99m };
只是代码的语法糖,如下所示:

Product product = new Product();
product.Name = "West Side Story";
product.Price = 9.99m;
如果在问题中提供的示例代码中对私有无参数构造函数进行注释,则会出现编译错误:

没有与“Product.Product(string,decimal)”的必需形式参数“name”对应的给定参数


这意味着C#编译器在分配属性值之前会尝试调用无参数构造函数来创建Product类的实例。希望有帮助。

基于属性的初始化要求存在无参数构造函数。正如@farhad jabiyev已经正确指出的,基于属性的初始化

Product product = new Product { Name = "West Side Story", Price = 9.99m };
只是代码的语法糖,如下所示:

Product product = new Product();
product.Name = "West Side Story";
product.Price = 9.99m;
如果在问题中提供的示例代码中对私有无参数构造函数进行注释,则会出现编译错误:

没有与“Product.Product(string,decimal)”的必需形式参数“name”对应的给定参数


这意味着C#编译器在分配属性值之前会尝试调用无参数构造函数来创建Product类的实例。希望能有帮助。

@jon skeet如果你能在上面照点光就太好了。@jon skeet如果你能在上面照点光就太好了。谢谢Farhad。但当我尝试基于属性的初始值设定项时。私有参数构造函数没有任何用处,当我尝试将其公开时,它给出了“无法在此上下文中使用属性或索引器,因为集合访问器不可访问。OVE注释指出,在上述代码设置器中,也应为公共的。你说什么?@hellowahab一切都好。您已将
访问器设置为私有。这意味着,它们在这个类的外部是只读的。是的,我知道,但是设置访问器私有将不允许基于属性的初始化。@hellowahab完全正确。虽然set accessor是私有的,但不能在此类外部设置此属性的值。但是,您可以调用任何将设置值的公共构造函数。谢谢Farhad。但当我尝试基于属性的初始值设定项时。私有参数构造函数没有任何用处,当我尝试将其公开时,它给出了“无法在此上下文中使用属性或索引器,因为集合访问器不可访问。OVE注释指出,在上述代码设置器中,也应为公共的。你说什么?@hellowahab一切都好。您已将
访问器设置为私有。这意味着,它们在这个类的外部是只读的。是的,我知道,但是设置了一个访问器