前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程小知识之 struct 构造函数(C#)

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

作者头像
用户2615200
发布2019-09-06 09:26:05
1.7K0
发布2019-09-06 09:26:05
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/tkokof1/article/details/100171366

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

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

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

举个例子:

代码语言:javascript
复制
public struct Value
{
    public int Value1 { get; }
    private int Value2;

    public Value(int value1, int value2)
    {
        Value1 = value1;
        Value2 = value2;
    }
}

上述代码中,我们在 Value 结构的有参构造函数中对其所有的成员进行了赋值,否则就会产生编译错误:

代码语言:javascript
复制
public struct Value
{
    public int Value1 { get; }
    private int Value2;

    public Value(int value1, int value2)
    {
        Value1 = value1;
        // cause error here ...
        //Value2 = value2;
    }
}

有时候,我们可能仅希望在 struct 的有参构造函数中初始化某些成员,其他的成员保持其默认值即可,怎么办呢?

方法其实挺简单,在有参构造函数中首先调用无参构造函数即可:

代码语言:javascript
复制
public struct Value
{
    public int Value1 { get; }
    private int Value2;

    // call parameterless constructor first
    public Value(int value1) : this()
    {
        Value1 = value1;
    }
}
  • struct 中 不能 定义无参构造函数 !

根据此规则,你不能定义一个 struct 的无参构造函数来定制化成员的初始值:

代码语言:javascript
复制
public struct Value
{
    public int Value1 { get; }
    private int Value2;

    // cause error here ...
    public Value()
    {
        Value1 = 1;
        Value2 = 1;
    }
}

可见 struct 成员的默认值不能进行定制,所以对象初始化对于 struct 的成员也不适用:

代码语言:javascript
复制
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 的无参构造函数).

譬如下面的代码:

代码语言:javascript
复制
var values = new Value[1000];

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

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

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

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

参考资料
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 更进一步
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档