网站建设公司优势,衡水网站制,赣州市人才网,生产公司简介模板翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》[1]在本文中#xff0c;我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论#x… 翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》[1]在本文中我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论public struct Person
{public string Name { get; set; }public string Surname { get; set; }public int Age { get; set; }public Person(string name, string surname, int age){Name name;Surname surname;Age age;}public void Replace(Person other){this other;}
}
如您所见所有属性都可以公开访问和修改。更糟糕的是我们甚至可以访问 this 通过调用 Replace 方法将其更改为同一结构体类型的另一个实例。这就是 readonly 关键字出现的原因。如果仅在结构体的定义中添加它如下所示public readonly struct Person
{public string Name { get; set; }public string Surname { get; set; }public int Age { get; set; }public Person(string name, string surname, int age){Name name;Surname surname;Age age;}public void Replace(Person other){this other;}
}
编译器会显示如下面截图中的错误提示为什么会这样这是因为当我们向结构体定义添加 readonly 关键字其实是把每个属性都设置为只读的了包括 this 的值。要让代码通过编译的唯一方法是把所有内容都设置为只读的也就是说我们的结构体应该像这样public readonly struct Person
{public string Name { get; }public string Surname { get; }public int Age { get; }public Person(string name, string surname, int age){Name name;Surname surname;Age age;}
}
因此添加 readonly 可以消除结构体实例内部或外部发生意外赋值或修改值的可能性。不过需要注意的一件事是如果您经常使用无参构造函数并给属性赋值像这样Person s new Person();
//错误
s.Age 15;
s.Name asd;
s.Surname qwe;
或者像这样//错误
Person s new Person
{Age 15,Name asd,Surname qwe
};
虽然此结构体的默认无参构造函数仍然可以调用但给任何属性赋值都将引发编译错误因为属性是只读的。实际上对此结构体的无参构造函数的调用会将其所有属性设置为它们的默认值而且在结构体实例的整个生命周期中永远不会被修改。正确的初始化方法是调用参数化构造函数Person s new Person(asd, qwe, 15);
总之这将有助于更容易地表明您的意图因为您可以从一开始就定义这个结构体是不可变和不可修改的。译者总结使用 readonly 修饰符声明 struct 的目的就是为了明确地声明一个不可变的值类型。readonly 结构体的所有数据成员都必须是只读的所有字段声明都必须具有 readonly 修饰符所有属性包括自动实现的属性都必须是只读的这就保证了 readonly 结构体的成员不会修改该结构体的状态。在 C# 8.0 及更高版本中除构造函数外的其他实例成员都是隐式 readonly 的。相关链接https://www.devsanon.com/c/c-7-2-lets-talk-about-readonly-structs/ C# 7.2 – Let’s Talk About Readonly Structs ↩︎https://mp.weixin.qq.com/s/wVikRMfc4BbrB6WbDy1gXw C# 中 Struct 和 Class 的区别总结 ↩︎作者 John Demetriou 译者 技术译民 出品 技术译站https://ITTranslator.cn/END