C# 没有构造函数,对象初始化是如何发生的?
构造函数的目的是在创建此类的对象时初始化所有成员变量 没有构造函数的对象初始化如何为属性赋值C# 没有构造函数,对象初始化是如何发生的?,c#,collections,C#,Collections,构造函数的目的是在创建此类的对象时初始化所有成员变量 没有构造函数的对象初始化如何为属性赋值 Product myProduct = new Product { ProductID = 100, Name = "Kayak", Description = "A boat for one person", Price = 275M, Category = "Watersports" }; 使用构造函数初始化对象 Product myProduct = new Product(){ Product
Product myProduct = new Product {
ProductID = 100, Name = "Kayak",
Description = "A boat for one person",
Price = 275M, Category = "Watersports"
};
使用构造函数初始化对象
Product myProduct = new Product(){
ProductID = 100, Name = "Kayak",
Description = "A boat for one person",
Price = 275M, Category = "Watersports"
};
您的两个对象创建表达式是等效的。如果未指定
()
,则默认情况下会为您提供它
因此:
相当于:
var foo = new Foo() { X = y };
根据C#5规范第7.6.10.1节:
如果对象创建表达式包含对象初始值设定项或集合初始值设定项,则可以省略构造函数参数列表和圆括号。省略构造函数参数列表和括号相当于指定空参数列表
因此,在这两种情况下,您都在调用Product
的无参数构造函数,这是由编译器提供的,因为您没有显式声明任何构造函数。同样根据C#5规范,这次是第10.11.4节:
如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只调用直接基类的无参数构造函数。如果类是抽象的,则默认构造函数的声明可访问性将受到保护。否则,为默认构造函数声明的可访问性是公共的
(这不包括静态类。)您的两个对象创建表达式是等效的。如果未指定
()
,则默认情况下会为您提供它
因此:
相当于:
var foo = new Foo() { X = y };
根据C#5规范第7.6.10.1节:
如果对象创建表达式包含对象初始值设定项或集合初始值设定项,则可以省略构造函数参数列表和圆括号。省略构造函数参数列表和括号相当于指定空参数列表
因此,在这两种情况下,您都在调用Product
的无参数构造函数,这是由编译器提供的,因为您没有显式声明任何构造函数。同样根据C#5规范,这次是第10.11.4节:
如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只调用直接基类的无参数构造函数。如果类是抽象的,则默认构造函数的声明可访问性将受到保护。否则,为默认构造函数声明的可访问性是公共的
(这不包括静态类。)您是说
产品
类没有构造函数,还是说没有在对象创建表达式中指定构造函数参数列表?不要混淆实例化语法和构造函数的存在或不存在。如果您没有特别提供无参数构造函数,则会自动为类提供一个无参数构造函数,并且两个语法都调用该无参数构造函数。@Jonsket否,关于对象创建表达式。我建议您澄清这一点-完全删除产品
类代码会有所帮助,事实上,你是说产品类没有构造函数,还是说没有在对象创建表达式中指定构造函数参数列表?不要混淆实例化语法和构造函数的存在或不存在。如果您没有特别提供无参数构造函数,则会自动为类提供一个无参数构造函数,并且两个语法都会调用该无参数构造函数。@Jonsket否,关于对象创建表达式。我建议您澄清这一点-事实上,完全删除产品类代码会有所帮助。