[英]Strange behavior of Struct in C#
我有一个如下结构。 我没什么问题
问题1:
struct MyStruct
{
public MyStruct(int a)
{
this.a = a;
this.b = 10;
}
public int a;
public int b;
}
当我从MyStruct构造器中删除this.b时,它将给我一个错误“必须将字段完全分配,然后控制权才能返回给调用者”。 但在上课的情况下不会发生
Problem2:
struct MyStruct
{
//public MyStruct(int a)
//{
// this.a = a;
// this.b = 10;
//}
//int asd;
//public int MyProperty { get; set; }
public void getImplemen()
{
Console.WriteLine("azsdfa");
}
public int a;
public int b;
}
static void Main(string[] args)
{
MyStruct myStruct ;
myStruct.a = 15;//when I comment this it will give an error
myStruct.b = 15; //when I comment this it will give an error
myStruct.getImplemen();
}
当我将MyStruct myStruct
更改为MyStruct myStruct = new MyStruct ();
它工作正常。
为什么这样?
就是这样。
默认构造函数将每个字段初始化为默认值,而带有参数的构造函数会强制您初始化结构中的每个字段。
如果您有一个默认的构造函数和一个带参数的构造函数,您会问? 好吧,我不记得了。 很容易自己检查。
它不为字段分配内存:
MyStruct myStruct;
分配内存并初始化构造函数中的字段:
MyStruct myStruct = new MyStruct();
如果不为变量分配内存,则不能为字段分配值。 构造函数分配内存并初始化字段(在将控制权返回给调用者之前,您需要在构造函数中初始化字段)。
您应该参考https://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx
您需要在使用结构之前创建该结构的实例。
区别在于,结构是值类型,而类是引用类型。 创建值类型对象时,将分配存储空间来存储值,因此其成员变量不能为null,而类成员变量可以为null。 因此,编译器仅在未分配结构成员变量时抱怨。
记住结构的经验法则:必须初始化所有字段。 值可以由您提供,也可以由默认值提供。
对于问题1:
当您使用'new'(不带参数)初始化struct时,其中的所有字段都将初始化为默认类型值(对于int为0,对于字符串为null等)。 由于您使用的是参数化构造函数,因此编译器不使用默认值一,因此,如果不初始化字段“ b”,则会出错。 您仍然可以按以下方式进行这项工作:
public MyStruct(int a) : this()
{
this.a = a;
}
对于问题2:
回想一下我一开始提到的经验法则。 因此,您可以将默认构造函数与“ new”初始化一起使用,或者在调用代码中设置字段值。
快速建议:请勿在类/结构中使用公共字段。 使用属性来封装它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.