我的结构如下。我有几个问题
问题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 ();
时
它工作正常。
为什么呢?
答案 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中使用公共字段。使用属性来封装它们。