版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tkokof1/article/details/100171366
本文简单介绍了 C# 中 struct 构造函数的一些知识~
struct(结构) 类型在 C# 中属于值类型(value type),其构造函数有一些限制:
举个例子:
public struct Value
{
public int Value1 { get; }
private int Value2;
public Value(int value1, int value2)
{
Value1 = value1;
Value2 = value2;
}
}
上述代码中,我们在 Value 结构的有参构造函数中对其所有的成员进行了赋值,否则就会产生编译错误:
public struct Value
{
public int Value1 { get; }
private int Value2;
public Value(int value1, int value2)
{
Value1 = value1;
// cause error here ...
//Value2 = value2;
}
}
有时候,我们可能仅希望在 struct 的有参构造函数中初始化某些成员,其他的成员保持其默认值即可,怎么办呢?
方法其实挺简单,在有参构造函数中首先调用无参构造函数即可:
public struct Value
{
public int Value1 { get; }
private int Value2;
// call parameterless constructor first
public Value(int value1) : this()
{
Value1 = value1;
}
}
根据此规则,你不能定义一个 struct 的无参构造函数来定制化成员的初始值:
public struct Value
{
public int Value1 { get; }
private int Value2;
// cause error here ...
public Value()
{
Value1 = 1;
Value2 = 1;
}
}
可见 struct 成员的默认值不能进行定制,所以对象初始化对于 struct 的成员也不适用:
public struct Value
{
public int Value1 { get; }
// cause error here ...
private int Value2 = 1;
public Value(int value1, int value2)
{
Value1 = value1;
Value2 = value2;
}
}
看到这里,不知道你有没有产生一个疑问: 为何 C# 不支持定义 struct 的无参构造函数呢?
自己对于此也有些疑惑,搜索了一下相关信息,目前是这么理解的:
大家都知道, C# 是基于 CLR 的, 在 CLR 中(IL层)其实是支持定义 struct 的无参构造函数的,但是 CLR 并不保证一定能够正确调用 struct 的无参构造函数(更明确的说,就是在某些应该调用 struct 无参构造函数的情况下, CLR 并不会调用 struct 的无参构造函数).
譬如下面的代码:
var values = new Value[1000];
即便你(IL层)定义了 Value 的无参构造函数, CLR 也不会产生对 Value 无参构造函数的调用(正常来讲, Value 的无参构造函数应该被调用 1000 次).
C# 基于 CLR, 自然也不会支持定义 struct 的无参构造函数了.
这个问题的答案我并不确定,但很有可能是基于效率,复杂度等工程因素上的考虑,知晓更多信息的朋友可以分享一下~