ibcadmin 发表于 2019-12-12 09:50:20

Read-only structs 只读结构

<p>原文:<a href="https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/">https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/</a></p>
<p>配景</p>
<p>在.NET天下中,有两种根本范例:引用范例和值范例。简朴地说,引用范例是可以继续/扩展的类,当通报引用范例对象时,通报的是一个“指针”;值范例是不能继续/扩展的结构,当通报值范例对象时,通报的是一个“副本”。</p>
<p>C#中的struct是一个值范例,它“内部继续”自System.ValueType。(我说的是结构之间没有继续。)</p>
<p>当在参数中利用struct时,会天生struct的副本,利用struct可能是高效的,由于它镌汰了堆对象分配的时间。</p>
<p>在很多场景中,开辟职员利用结构作为通报值的有用方法,例如方法的返回对象,大概跨应用步伐利用的根本数据结构。</p>
<p>只读结构</p>
<p>只读结构是其公共成员为只读的结构,就好像“this”变量一样。</p>
<p>看一下下面的声明:</p>

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;
    }
}

<p>可以看到,我可以完全访问已声明的属性Age和Name,还可以访问this变量,如许就可以用另一个实例S来更换this实例。</p>
<p>假如我在声明中添加readonly修饰符,我的访问权限将受到限定:</p>
<ul>
<li>全部的成员(属性、字段)必须是自读;</li>
<li>我必要在公共的有参构造函数中初始化成员;</li>
<li>除了在构造函数中,“this”变量在其他地方都是只读的;</li>
<li>你不能界说“类字段”变乱;</li>
</ul>
<p>下面的截图表现了上面的代码改成了readonly struct后必要修正的地方。</p>
<p></p>
<p>下面是修改后的代码:</p>

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;
    }
}

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

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.
}

<p>结论</p>
<p>只读结构是一个方便的特性,可以资助保护你的值被不测修改的影响;与其他新特性相团结(例如,ref结构和in参数),它将使你的C#代码更容易地面向低级别的编程。在接下来的几篇文章中,我将表明全部这些新事物。请留意,你必要C# 7.2才气利用这个特性,它在Visual Studio 2017.5 Preview 4或更高版本中可用。</p>
<p> </p>
<pdata-section="4">系列文章:</p>
<ul>
<lidata-section="4"><a href="https://www.cnblogs.com/wenhx/p/csharp-7-series-part-1-value-tuples.html" target="_blank">[译]C# 7系列,Part 1: Value Tuples 值元组</a></li>
<lidata-section="4"><a href="https://www.cnblogs.com/wenhx/p/csharp-7-series-part-2-async-main.html" target="_blank">[译]C# 7系列,Part 2: Async Main 异步Main方法</a></li>
<lidata-section="4"><a href="https://www.cnblogs.com/wenhx/p/csharp-7-series-part-3-default-literals.html" target="_blank">[译]C# 7系列,Part 3: Default Literals 默认文本表达式</a></li>
<li><a href="https://www.cnblogs.com/wenhx/p/csharp-7-series-part-4-discards.html" target="_blank">[译]C# 7系列,Part 4: Discards 弃元</a></li>
<li><a href="https://www.cnblogs.com/wenhx/p/csharp-7-series-part-5-private-protected.html" target="_blank">[译]C# 7系列,Part 5: private protected 访问修饰符</a></li>
</ul>
页: [1]
查看完整版本: Read-only structs 只读结构