gpt4 book ai didi

c# - 对于结构,我是否必须在 C# 中显式调用构造函数?

转载 作者:太空狗 更新时间:2023-10-30 00:09:10 25 4
gpt4 key购买 nike

问题是关于结构的。当我声明一个结构类型变量/对象(不知道哪个更适合)或一个数组或结构列表时,我是否必须像对象一样显式调用构造函数,还是像变量一样只声明就足够了?

最佳答案

C# 中的结构可以在调用或不调用构造函数的情况下创建。在没有调用构造函数的情况下,struct 的成员将被初始化为默认值(基本上清零),并且 struct 在其所有字段都被初始化之前不能使用。

来自文档:

When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. If you do not use new, the fields will remain unassigned and the object cannot be used until all of the fields are initialized.

下面是一些例子:

struct Bar
{
public int Val;

public Bar( int v ) { Val = v; }
}

public void Foo()
{
Bar z; // this is legal...
z.Val = 5;

Bar q = new Bar(5); // so is this...
q.Val = 10;

// using object initialization syntax...
Bar w = new Bar { Val = 42; }
}

结构数组不同于单个结构变量。当您声明一个结构类型的数组时,您就是在声明一个引用变量 - 因此,您必须使用 new 运算符分配它:

Bar[] myBars = new Bar[10];  // member structs are initialized to defaults

如果您的结构具有构造函数,您还可以选择使用数组初始化语法:

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) };

你可以得到比这更复杂的东西。如果您的 struct 具有原始类型的隐式转换运算符,您可以像这样初始化它:

struct Bar
{
public int Val;

public Bar( int v ) { Val = v; }

public static implicit operator Bar( int v )
{
return new Bar( v );
}
}

// array of structs initialized using user-defined implicit converions...
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 };

关于c# - 对于结构,我是否必须在 C# 中显式调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com