原文: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 6: Read-only structs 只读结构的更多相关文章

  1. [译]C# 7系列,Part 9: ref structs ref结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...

  2. [译]C# 7系列,Part 8: in Parameters in参数

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...

  3. [译]C# 7系列,Part 2: Async Main 异步Main方法

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...

  4. [译]C# 7系列,Part 3: Default Literals 默认文本表达式

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default ...

  5. [译]C# 7系列,Part 4: Discards 弃元

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/ 有时我们想要忽略一个方法返回的值,特 ...

  6. [译]C# 7系列,Part 5: private protected 访问修饰符

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性 ...

  7. [译]C# 7系列,Part 7: ref Returns ref返回结果

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传 ...

  8. [译]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- ...

  9. [译]C# 7系列,Part 1: Value Tuples 值元组

    Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microso ...

随机推荐

  1. [ch03-01] 均方差损失函数

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 3.1 均方差函数 MSE - Mean Square ...

  2. 新闻实时分析系统-inux环境准备与设置

    1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...

  3. 记一次net/net core delete 方法报404 解决方案

    今天一个net core的delete方法 执行的时候 报404 网上查阅资料后发现是IIS 默认只允许get/post方法接入 网上查找资料后 在web.config添加如下代码: 意为移除WebD ...

  4. day 27 网路编程 面向对象多继承

    知识补充: 字符串转化为字节 string1  = input(“请输入你的名字”) string1.encode('utf-8') 字节转化为字符串 byte1 = b"alex" ...

  5. JSONPath入门之Snack3篇

    Snack3 for java 一个微型JSON框架 基于jdk8,60kb.有序列化反序列化.解析和转换.支持 Json path 查询. <dependency> <groupI ...

  6. Django总结目录

    Django总结目录 1. django框架简介及自定义简易版框架 2. 路由层 3. 视图层 4. 模板层 5. 模型层 5.1 基本操作 5.2 多表操作 5.3 进阶相关 6. 组件 6.1 a ...

  7. Zookeeper 应用实现-配置中心

    一.目标 一个乞丐版自更新配置中心,更新配置后,能在各个服务器实现更新 二.架构 三.角色 config-web: 配置后台,主要用于管理配置,增改配置 config-agent: 监听配置,遇到变动 ...

  8. SpringBoot+Mybatis 实现动态数据源切换方案

    背景 最近让我做一个大数据的系统,分析了一下,麻烦的地方就是多数据源切换抽取数据.考虑到可以跨服务器跨数据库抽数,再整理数据,就配置了这个动态数据源的解决方案.在此分享给大家. 实现方案 数据库配置文 ...

  9. CSS3 斑马条纹.html

    hvkhujluhijo hvkhujluhijo hvkhujluhijo hvkhujluhijo hvkhujluhijo <!DOCTYPE html> <html> ...

  10. 转:Spring配置文件<context:property-placeholder>标签使用漫谈

    <context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...