请选择 进入手机版 | 继续访问电脑版

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

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 509|回复: 15

Read-only structs 只读结构

  [复制链接]
  • TA的每日心情
    开心
    前天 21:32
  • 签到天数: 1610 天

    [LV.Master]伴坛终老

    4251

    主题

    6177

    帖子

    11万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    111382

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-12-12 09:50:20 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    原文: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编程社区
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则