[译]C# 7系列,Part 6: Read-only structs 只读结构
原文: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(, "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或更高版本中可用。
系列文章:
- [译]C# 7系列,Part 1: Value Tuples 值元组
- [译]C# 7系列,Part 2: Async Main 异步Main方法
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
- [译]C# 7系列,Part 4: Discards 弃元
- [译]C# 7系列,Part 5: private protected 访问修饰符
- [译]C# 7系列,Part 6: Read-only structs 只读结构 (本文)
- [译]C# 7系列,Part 7: ref Returns ref返回结果
- [译]C# 7系列,Part 8: in Parameters in参数
- [译]C# 7系列,Part 9: ref structs ref结构
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理 (完)
[译]C# 7系列,Part 6: Read-only structs 只读结构的更多相关文章
- [译]C# 7系列,Part 9: ref structs ref结构
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...
- [译]C# 7系列,Part 8: in Parameters in参数
原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...
- [译]C# 7系列,Part 2: Async Main 异步Main方法
原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...
- [译]C# 7系列,Part 4: Discards 弃元
原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/ 有时我们想要忽略一个方法返回的值,特 ...
- [译]C# 7系列,Part 5: private protected 访问修饰符
原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性 ...
- [译]C# 7系列,Part 7: ref Returns ref返回结果
原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传 ...
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...
- [译]C# 7系列,Part 1: Value Tuples 值元组
Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...
随机推荐
- Windows Server 2008 服务器重启后卡死在Windows Update 页面问题处理
Windows Update 服务器 服务器是联想RD640 操作系统Windows Server 2008 R2 Enterprise版 补丁版本是SP1 远程windows服务器时,一直处于远程建 ...
- 02-tornado学习笔记-环境配置
Ubuntu16.04开发环境 1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码 $sudo passwd root 2.修改主机名 $vi /etc ...
- scikit-learn文本特征提取之TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术. TF-IDF是一种统计方法,用以评估一字词对于一个文件集 ...
- Git实战指南----跟着haibiscuit学Git(第一篇)
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
- 部署高可用 schduler
目录 创建 kube-scheduler 证书和私钥 创建和分发 kubeconfig 文件 创建 kube-scheduler 配置文件 创建kube-scheduler启动文件 启动kube-sc ...
- Xtrabackup 全备和还原以及增量备份和还原
目录 MySQL环境介绍 全备和还原 准备备份目录 创建测试数据 全量备份 模拟删除数据 还原数据操作 第一步 备份备份文件 第二步 关闭数据库 第三步 移除数据库的data目录 第四步 恢复前准备 ...
- Chapter 01—Introduction to R
1.getwd():list the current working directory. (即获得当前工作路径) 2.setwd("mydirectory"):change th ...
- k 近邻算法解决字体反爬手段|效果非常好
字体反爬,是一种利用 CSS 特性和浏览器渲染规则实现的反爬虫手段.其高明之处在于,就算借助(Selenium 套件.Puppeteer 和 Splash)等渲染工具也无法拿到真实的文字内容. 这种反 ...
- shell执行数学运算
整数: expr let $(()) $[] 浮点数: bc 1.使用expr ♦参与运算的成员和运算符之间必须有一个空格: ♦对于那些容易被shell错解的,在它们传入expr命令之前,需要使用sh ...
- 17-Python执行JS代码--PyExecJS、PyV8、Js2Py
一.Python执行JS代码--PyExecJS.PyV8.Js2Py 1.1.PyExecJS PyExecJS的优点是您不需要照顾JavaScript环境.特别是,它可以在Windows环境中运行 ...