马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

Read-only structs 只读结构

  [复制链接]
查看2716 | 回复19 | 2019-12-12 09:50:20 | 显示全部楼层 |阅读模式

原文: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”变量一样。

看一下下面的声明:

  1. public struct S
  2. {
  3. public int Age { get; set; }
  4. public string Name { get; set; }
  5. public S(int age, string name)
  6. {
  7. this.Age = age;
  8. this.Name = name;
  9. }
  10. public S(S other)
  11. {
  12. this = other;
  13. }
  14. public S Replace(S other)
  15. {
  16. S value = this;
  17. this = other;
  18. return value;
  19. }
  20. }
复制代码

可以看到,我可以完全访问已声明的属性Age和Name,还可以访问this变量,如许就可以用另一个实例S来更换this实例。

假如我在声明中添加readonly修饰符,我的访问权限将受到限定:

  • 全部的成员(属性、字段)必须是自读;
  • 我必要在公共的有参构造函数中初始化成员;
  • 除了在构造函数中,“this”变量在其他地方都是只读的;
  • 你不能界说“类字段”变乱;

下面的截图表现了上面的代码改成了readonly struct后必要修正的地方。

095326az0w43zzdr0l0u0s.png

下面是修改后的代码:

  1. public readonly struct S
  2. {
  3. public int Age { get; }
  4. public string Name { get; }
  5. public S(int age, string name)
  6. {
  7. this.Age = age;
  8. this.Name = name;
  9. }
  10. public S(S other)
  11. {
  12. this = other;
  13. }
  14. }
复制代码

你可以像往常一样初始化S的新实例。但是你不能修改任何实例的任何成员。你应该总是调用有参(而不是无参)构造函数来准确初始化实例对象,否则您将得到实例的默认值(全部成员都被初始化为成员范例的默认值)。

  1. private static void Test()
  2. {
  3. S s = new S(18, "Anna");
  4. ref S other = ref s;
  5. other = new S(other);
  6. bool equal = s.Equals(other); // true.
  7. }
复制代码

结论

只读结构是一个方便的特性,可以资助保护你的值被不测修改的影响;与其他新特性相团结(例如,ref结构和in参数),它将使你的C#代码更容易地面向低级别的编程。在接下来的几篇文章中,我将表明全部这些新事物。请留意,你必要C# 7.2才气利用这个特性,它在Visual Studio 2017.5 Preview 4或更高版本中可用。

系列文章:

C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则