原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/
配景
在.NET天下中,有两种根本范例:引用范例和值范例。简朴地说,引用范例是可以继续/扩展的类,当通报引用范例对象时,通报的是一个“指针”;值范例是不能继续/扩展的结构,当通报值范例对象时,通报的是一个“副本”。
C#中的struct是一个值范例,它“内部继续”自System.ValueType。(我说的是结构之间没有继续。)
当在参数中利用struct时,会天生struct的副本,利用struct可能是高效的,由于它镌汰了堆对象分配的时间。
在很多场景中,开辟职员利用结构作为通报值的有用方法,例如方法的返回对象,大概跨应用步伐利用的根本数据结构。
只读结构
只读结构是其公共成员为只读的结构,就好像“this”变量一样。
看一下下面的声明:
- public struct S
- {
- public int Age { get; set; }
- public string Name { get; set; }
- public S(int age, string name)
- {
- this.Age = age;
- this.Name = name;
- }
- public S(S other)
- {
- this = other;
- }
- public S Replace(S other)
- {
- S value = this;
- this = other;
- return value;
- }
- }
复制代码
可以看到,我可以完全访问已声明的属性Age和Name,还可以访问this变量,如许就可以用另一个实例S来更换this实例。
假如我在声明中添加readonly修饰符,我的访问权限将受到限定:
- 全部的成员(属性、字段)必须是自读;
- 我必要在公共的有参构造函数中初始化成员;
- 除了在构造函数中,“this”变量在其他地方都是只读的;
- 你不能界说“类字段”变乱;
下面的截图表现了上面的代码改成了readonly struct后必要修正的地方。
下面是修改后的代码:
- public readonly struct S
- {
- public int Age { get; }
- public string Name { get; }
- public S(int age, string name)
- {
- this.Age = age;
- this.Name = name;
- }
- public S(S other)
- {
- this = other;
- }
- }
复制代码
你可以像往常一样初始化S的新实例。但是你不能修改任何实例的任何成员。你应该总是调用有参(而不是无参)构造函数来准确初始化实例对象,否则您将得到实例的默认值(全部成员都被初始化为成员范例的默认值)。
- private static void Test()
- {
- S s = new S(18, "Anna");
- ref S other = ref s;
- other = new S(other);
- bool equal = s.Equals(other); // true.
- }
复制代码
结论
只读结构是一个方便的特性,可以资助保护你的值被不测修改的影响;与其他新特性相团结(例如,ref结构和in参数),它将使你的C#代码更容易地面向低级别的编程。在接下来的几篇文章中,我将表明全部这些新事物。请留意,你必要C# 7.2才气利用这个特性,它在Visual Studio 2017.5 Preview 4或更高版本中可用。
系列文章:
|