23

编程小知识之 struct 构造函数(C#)

 3 years ago
source link: https://blog.csdn.net/tkokof1/article/details/100171366
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

编程小知识之 struct 构造函数(C#)

本文简单介绍了 C# 中 struct 构造函数的一些知识~

struct(结构) 类型在 C# 中属于值类型(value type),其构造函数有一些限制:

  • struct 有参构造函数中必须为所有成员(包括自动实现的属性,后面对于这点的说明从略)赋值

举个例子:

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 中 不能 定义无参构造函数 !

根据此规则,你不能定义一个 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 的无参构造函数呢?

自己对于此也有些疑惑,搜索了一下相关信息,目前是这么理解的:

  • 直接的一个原因: CLR 不"支持"

大家都知道, C# 是基于 CLR 的, 在 CLR 中(IL层)其实是支持定义 struct 的无参构造函数的,但是 CLR 并不保证一定能够正确调用 struct 的无参构造函数(更明确的说,就是在某些应该调用 struct 无参构造函数的情况下, CLR 并不会调用 struct 的无参构造函数).

譬如下面的代码:

var values = new Value[1000];

即便你(IL层)定义了 Value 的无参构造函数, CLR 也不会产生对 Value 无参构造函数的调用(正常来讲, Value 的无参构造函数应该被调用 1000 次).

C# 基于 CLR, 自然也不会支持定义 struct 的无参构造函数了.

  • 那进一步的问题是,为何 CLR 不完整支持 struct 的无参构造函数呢?

这个问题的答案我并不确定,但很有可能是基于效率,复杂度等工程因素上的考虑,知晓更多信息的朋友可以分享一下~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK