Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中Struct的奇怪行为#_C#_Struct - Fatal编程技术网

C# C中Struct的奇怪行为#

C# C中Struct的奇怪行为#,c#,struct,C#,Struct,我的结构如下。我没有什么问题 问题1: struct MyStruct { public MyStruct(int a) { this.a = a; this.b = 10; } public int a; public int b; } 当我从MyStruct constructor中删除这个.b时,它会给我一个错误“在控件返回给调用方之前必须完全分配字段”。但在课堂上,它不会发生 问题2: struct MyStru

我的结构如下。我没有什么问题

问题1:

struct MyStruct 
{
    public MyStruct(int a)
    {
        this.a = a;
        this.b = 10;
    }
    public int a;
    public int b;
}
当我从MyStruct constructor中删除这个.b时,它会给我一个错误“在控件返回给调用方之前必须完全分配字段”。但在课堂上,它不会发生

问题2:

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=newmystruct()
它很好用


为什么会这样?

事情就是这样

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

如果您有一个默认构造函数和一个带参数的构造函数,您会问这个问题吗?嗯,我不记得了。很容易自己检查。

您应该参考


您需要先创建结构实例,然后再使用它。

它不会为字段分配内存:

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

MyStruct myStruct = new MyStruct();

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

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

记住结构的拇指规则:所有字段都必须初始化。值可以由您提供,也可以由默认值提供

关于问题1:

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

public MyStruct(int a) : this()
{
   this.a = a;
}
关于问题2:

回想一下我在开头提到的拇指法则。因此,您可以使用带有“new”初始化的默认构造函数,也可以在调用代码中设置字段值


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

结构就是这样工作的。在理解结构如何工作以及为什么要使用类之前,您应该坚持使用类。诚实,无缘无故地使用
struct
只会给你带来痛苦。请以后每个问题问一个问题。是的,Blorgbeard,我会尽量按照你在未来问卷调查中的建议做:)我知道那件事,但为什么上课时它不会给我一个错误。这是我的问题。看:你不应该问为什么错误不会在课堂上发生。它为您初始化默认值的行为相当容易理解。结构的情况很奇怪,应该受到质疑,因此你可以查看链接@Blorgbeard shared@Yorye,是的,你是对的,我的重点应该是结构。顺便说一句,你指的是哪个链接?你能分享Blorgbeard的链接吗?这是对这个答案的第二个评论。我知道这就是为什么我说当我使用MyStruct MyStruct时,它会给出一个错误,但是当使用new时,它工作得很好。但是为什么会有这种行为?为什么会有新的结构案例?这个人通过解释原因回答了他的问题(尽管你没有提到他的参数)+1.