繁体   English   中英

C#中Struct的奇怪行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM