C# 末尾带有'this()'的结构构造函数与另一个不带'this()'的结构构造函数有什么区别?
假设我们有这两个结构C# 末尾带有'this()'的结构构造函数与另一个不带'this()'的结构构造函数有什么区别?,c#,struct,constructor,C#,Struct,Constructor,假设我们有这两个结构 public struct Example { public int Number { get; set; } public Example(int Number) { Number = number; } } 以及: 您可以看到,有一个结构的构造函数结尾带有**this()**,另一个没有 两者之间有什么区别?没有区别this()将调用无参数构造函数,这是定义结构所必需的,除非您重新定义它并自定义其行为,否则它不会做任何
public struct Example
{
public int Number { get; set; }
public Example(int Number)
{
Number = number;
}
}
以及:
您可以看到,有一个结构的构造函数结尾带有**this()**
,另一个没有
两者之间有什么区别?没有区别
this()
将调用无参数构造函数,这是定义结构所必需的,除非您重新定义它并自定义其行为,否则它不会做任何事情。如果是struct
s,则不允许定义自己的无参数构造函数;使用class
es,您可以
但是,请注意,构造函数链接是在复杂的构造场景中进行干燥的一个方便工具:即当对象公开具有不同参数的多个构造函数时。更新
对于类:
区别在于调用this()
的构造函数也将调用不带参数的类的构造函数。例如,如果这是你的班级:
public class Example
{
public int Number { get; set; }
public Example(int number) : this()
{
Number = number;
}
public Example()
{
Console.WriteLine("Hello");
}
}
然后包括this()
也会打印“Hello”。这是一种将构造函数链接在一起的方法,用于代码重用
对于结构:
不能在结构中添加空构造函数,因此添加this()
不会带来任何好处。感谢vendettamit唤醒了我疲惫的大脑。调用this()将所有字段初始化为零。C#编译器要求在构造函数中初始化所有结构字段。因此,如果不希望指定所有字段,则应调用this()
不会编译:
struct A
{
public int field1;
public string field2;
public A(string str)
{
field2 = str;
}
}
给出:
错误CS0171在将控制返回给调用方之前,必须完全分配字段“A.field1”
好的:
struct A
{
public int field1;
public string field2;
public A(string str) : this()
{
field2 = str;
}
}
奇怪,但仍然可以:
struct A
{
public int field1;
public string field2;
public A(string str)
{
this = new A(); // in structs 'this' is assignable
field2 = str;
}
}
或
在您的示例中,没有任何行为更改,因为
this()
调用了未定义的结构的无参数构造函数
请注意,在C#6.0及更新版本中,您不能使用结构的无参数构造函数,因此如果您这样做:
public struct Example
{
public Example() // compile error in c# 6.0 and up
{
}
}
您将得到一个编译错误。更多细节
在旧版本的C#中,您可以重新定义无参数构造函数,这意味着您可以通过修改无参数构造函数在参数化构造函数中注入额外的行为
除此之外,由于为this()
构造函数生成了额外的IL代码,理论性能可能会受到影响:
Example..ctor:
IL_0000: ldarg.0
IL_0001: initobj UserQuery.Example
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000A: call UserQuery+Example.set_Number
IL_000F: nop
IL_0010: ret
你所说的“定义结构”是什么意思?C#中有
struct
s和class
es,有关详细信息,请参阅文档。第二个示例中的C'tor调用空C'tor,请参见:值得注意的是,在某些版本的C#编译器中可能需要这种语法。()CS0568结构不能包含显式无参数构造函数。根据C#的版本,在C#5.0中可以定义无参数结构构造函数。
public struct Example
{
public Example() // compile error in c# 6.0 and up
{
}
}
Example..ctor:
IL_0000: ldarg.0
IL_0001: initobj UserQuery.Example
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000A: call UserQuery+Example.set_Number
IL_000F: nop
IL_0010: ret