C# 10 中Struct的变化

作者 : 慕源网 本文共2188个字,预计阅读时间需要6分钟 发布时间: 2021-11-19 共534人阅读

在 C# 10 中,  Struct的语言发生了一些有趣的变化。在这篇博文中,我们将研究其中的一些并理解它们的重要性。

无参数构造函数

就 struct 而言,主要和显着的变化之一是引入了对显式无参数构造函数的支持 。例如,以下代码不可编译。

public struct Foo {
    public Foo() => (FirstName, LastName) = ("John", "Doe");
    public string FirstName {
        get;
        set;
    }
    public string LastName {
        get;
        set;
    }
}

语言开发人员现在已经取消了该限制,允许开发人员为其结构定义显式构造函数。让我们看一个例子。

public struct Foo {
    public Foo() => (FirstName, LastName) = ("John", "Doe");
    public string FirstName {
        get;
        set;
    }
    public string LastName {
        get;
        set;
    }
}
Foo foo = new();
Console.WriteLine($ "FirstName : {foo.FirstName}, LastName : {foo.LastName}");
// Output
FirstName: John, LastName: Doe

由于支持显式构造函数,上述代码在 C# 10 中完全有效。但是,应注意确保在构造函数中初始化所有字段。例如,以下代码无效。

public struct Foo
{
    public Foo() => FirstName= "John";
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

这将引发异常,抱怨 LastName 属性在控件返回调用者之前应该为非空或完全赋值。

这给我们带来了一个重要的区别,开发人员在从 C# 9 迁移到 C# 10 时需要注意这一点。请考虑以下代码。

Foo foo1 = new ();
Foo foo2 = default;

Console.WriteLine($"foo1 Equals foo2 : {Equals(foo1,foo2)}");

对于 C# 10,除非检查源代码以确保未显式定义默认构造函数,否则无法确定。如果定义了显式默认构造函数,则字段将被初始化并且可能具有不同的值。

字段初始值设定项

C# 9.0 中的 Struct不允许开发人员使用字段初始值设定项。以下代码在 C# 9 中无效。

public struct Foo {
    public string FirstName {
        get;
        set;
    } = "John";
    public string LastName {
        get;
        set;
    } = "Doe";
}

这在 C# 10 中再次发生了变化,支持字段初始值设定项。下面的代码将为我们提供与前面带有显式构造函数的示例相同的结果。

public struct Foo {
    public string FirstName {
        get;
        set;
    } = "John";
    public string LastName {
        get;
        set;
    } = "Doe";
}
Foo foo = new();
Console.WriteLine($ "FirstName : {foo.FirstName}, LastName : {foo.LastName}");
// Output
FirstName: John, LastName: Doe

支持 With 表达式

C# 10 中 struct 的另一个关键改进是对with 表达式的支持 。在 C# 9 中,C#  中引入了record作为创建具有不可变属性的不可变数据结构的一种方式。在与表达式允许开发人员创建现有的克隆 record 有微妙的变化。例如

public record Person(string FirstName, string LastName);
var johnDoe = new {
    FirstName = "John",
        LastName = "Doe"
};
var janeDoe = johnDoe with {
    FirstName = "Jane"
};

实例 janeDoe 是一个新对象,其属性与johnDoe 的值  相同,但 FirstName已被赋予新值。

语言团队现在也添加了对with 表达式用于 struct 的支持  。例如,以下代码在 C# 10 中完全有效。

Foo foo1 = new ()
{
    FirstName = "John",
    LastName = "Doe"
};
var foo2 = foo1 with { FirstName = "Jane"};
foo1=>FirstName : John, LastName : Doe
foo2=>FirstName : Jane, LastName : Doe

其中 Foo 定义为

public struct Foo
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

语言团队决定在 记录范围之外使用 with表达式是一个很好的方法。如果这样一个强大的工具不能与其他数据结构一起使用,那将是一种耻辱。事实上,  匿名类型现在也支持with表达式。

var foo1 = new
{
    FirstName = "John",
    LastName = "Doe"
};
var foo2 = foo1 with { FirstName = "Jane"};

因此,在这篇博文中,我们访问了开发人员可以在 C# 10 中看到的一些struct 变化 。老实说,语言的发展方式非常值得一看。


慕源网 » C# 10 中Struct的变化

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录