Struct在C#中的奇怪行为

时间:2015-09-04 04:50:33

标签: c# struct

我的结构如下。我有几个问题

问题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 ();时 它工作正常。

为什么呢?

5 个答案:

答案 0 :(得分:4)

它是怎么回事。

默认构造函数将每个字段初始化为默认值,而带参数的构造函数强制您初始化结构中的每个字段。

如果您有默认构造函数和带参数的构造函数,请问?好吧,我不记得了。很容易自己检查。

答案 1 :(得分:2)

它不为字段分配内存:

MyStruct myStruct;

在构造函数中分配内存并初始化字段:

MyStruct myStruct = new MyStruct();

如果没有为变量分配内存,则无法为字段分配值。 Сonstructor分配内存并初始化字段(在控制返回给调用者之前,需要在构造函数中初始化字段)。

答案 2 :(得分:0)

你应该参考https://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

在使用之前,您需要创建结构的实例。

答案 3 :(得分:0)

区别在于结构是值类型,而类是引用类型。创建值类型对象时,将分配内存空间来存储值,因此其成员变量不能为null,而类成员变量可以为null。因此,编译器仅在未将struct成员变量分配给。

时进行投诉

答案 4 :(得分:0)

记住Structs的缩略图规则:必须初始化所有字段。值可由您或默认值提供。

问题1:

使用'new'(不带参数)初始化struct时,其中的所有字段都初始化为默认类型值(0表示int,null表示字符串等)。由于您使用的是参数化构造函数,因此编译器不使用默认值,因此如果不初始化字段'b',则会出错。您仍然可以按照以下方式进行此操作:

public MyStruct(int a) : this()
{
   this.a = a;
}

问题2:

回想一下我在开头提到的拇指规则。因此,要么使用默认构造函数和'new'初始化,要么在调用代码时设置字段值。

快速建议:请不要在class / struct中使用公共字段。使用属性来封装它们。