Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# struct是否有默认构造函数?_C#_Struct_Constructor - Fatal编程技术网

C# struct是否有默认构造函数?

C# struct是否有默认构造函数?,c#,struct,constructor,C#,Struct,Constructor,我在某个地方读到,使用new实例化struct为实例的所有变量指定默认值。这是否意味着结构将通过默认的隐藏构造函数初始化其值 这是否意味着结构将通过默认的隐藏构造函数初始化其值 是的,从某种意义上说,所有成员字段都将设置为其默认(T)值 实际上,编译器可以执行类似于memset(ptr,0,sizeInBytes)的操作。实际发生的是一个实现细节 Struct不能有无参数构造函数,为了初始化值,必须使用参数编写构造函数,并在对象初始化时显式调用它,并且必须初始化所有字段,默认情况下,如果您没有指

我在某个地方读到,使用
new
实例化
struct
为实例的所有变量指定默认值。这是否意味着结构将通过默认的隐藏构造函数初始化其值

这是否意味着结构将通过默认的隐藏构造函数初始化其值

是的,从某种意义上说,所有成员字段都将设置为其
默认(T)


实际上,编译器可以执行类似于
memset(ptr,0,sizeInBytes)
的操作。实际发生的是一个实现细节

Struct不能有无参数构造函数,为了初始化值,必须使用参数编写构造函数,并在对象初始化时显式调用它,并且必须初始化所有字段,默认情况下,如果您没有指定构造函数,所有值都将初始化为默认值,就像您所说的不可见值一样。
注意:例如,CLR允许结构在IL语言中具有无参数构造函数

在.NET中,占用N个字节的每种类型的存储位置都有一个默认值,其表示形式是初始化为零的N个字节序列。任何引用类型的默认值将作为空引用,任何数值类型的默认值将作为数字零,结构类型的默认值将作为其成员都具有默认类型的实例。创建包含存储位置的对象时,存储位置初始化为默认值;与进程相关的存储位置类型的唯一方面是其大小。如果结构类型
Foo
的长度为16字节,并且类具有类型为
Foo
的字段,则创建该类的实例将为该结构保留16字节,并将其初始化为零,而不调用该结构的任何构造函数

请注意,如果结构具有无参数构造函数,则在某些情况下创建实例将调用该构造函数,但在许多情况下,创建存储位置将在不调用构造函数的情况下有效地创建实例。因为不总是清楚哪种处理方法适用于哪种情况,一些语言设计者决定通过简单地禁止定义无参数构造函数并假设没有结构会有无参数构造函数来回避这个问题(忽略用其他语言声明无参数构造函数的可能性).

我的“变通方法”是使用具有无参数构造函数的结构

struct MyStruc
{
    // MyStruc( int NoOp = 0 ) did not work. The code was not called until a parameter was passed in. 
    public MyStruc( int NoOp )
    {
       MyFooBar = new FooBar()
    }

    public FooBar MyFooBar;
}

public class Main
{
    // Implementation
    public MyStruc ms = new MyStruct(0);
}

在您的解释中隐含:由C#编译器创建的
struct
没有这样的无参数实例构造函数。所以最后一段与这样一个结构无关。@JeppeStigNielsen:我没有跟踪C#的演变。我知道有人谈论过允许无参数结构构造函数,但不知道这些构造函数是否有任何变化。就我个人而言,我不喜欢语言设计师决定底层平台程序员可以访问哪些功能的想法,特别是对于像C#这样的语言,它们应该是“通用的”。例如,我认为具有讽刺意味的是,vb.net异常处理在语义上多年来一直优于C#,因为它可能(尽管有些尴尬)有一个
finally
子句……根据
try
子句是否正常退出而不必捕获异常,其行为会有所不同。在大多数情况下,异常处理的适当模型应该是,当对象可能处于无效状态时发生的意外异常应使其处于明确无效状态,但使对象无效的代码的存在不应导致异常被视为“已处理”。跳过新关键字时会发生什么情况?编译器会将所有公共字段视为未赋值字段。你必须一个接一个地设置它们。当您拥有属性时,结构将不可用。