gpt4 book ai didi

c# - readonly 修饰符和 private setter 之间哪个更好?

转载 作者:IT王子 更新时间:2023-10-29 03:47:16 26 4
gpt4 key购买 nike

我一直致力于创建一个类,突然想到这两个代码之间的区别:

public readonly string ProductLocation;

public string ProductLocation
{
get;
private set;
}

你们能告诉我什么时候更好地使用以下内容吗?谢谢。

最佳答案

第一个是只读字段,而第二个被编译为一对方法(并且属性 ProductLocation 的所有读取都被编译为对相应 get 的调用 方法并写入它被编译成对 set 方法的调用;在内部,这些方法将读取/写入一个内部的、自动生成的、非只读字段)。 我想说最重要的区别是线程安全! (如何?继续阅读!)

该类的基本用法看起来完全相同:其他类中的代码将只能读取该值,而不能更改它。此外,读取值的代码看起来完全相同(例如,print(myInstace.ProductLocation);在这里,您不知道它是如何声明的,酷吧?)

第一个也是最微不足道的区别是,具有私有(private) setter 的属性允许同一类的实例修改值,而在只读属性的情况下,甚至对象本身也无法更改值。

现在,为了线程安全。 当您使用多线程时,字段上的 readonly 属性将改变其内存可见性语义(就像 Java 的 final 字段)。

readonly 字段只能在声明时或在构造函数中赋值。 分配给 readonly 字段的值不能更改(至少不能以正常的方式)并且保证每个线程都会看到正确的初始化值在构造函数返回之后。因此,readonly 字段本质上是线程安全的。

要使用该属性实现相同的线程安全性,您必须在代码中添加一些同步,这很容易出错。这可能会导致死锁、数据争用或性能下降,具体取决于具体情况,尤其是在您没有经验的情况下。

因此,如果值表示的东西在对象构造后语义上不能更改,则不应声明私有(private) setter(这意味着对象可能会更改它)。寻找只读字段(并可能将其声明为私有(private)并声明一个只有 getter 访问该字段的公共(public)属性!这实际上是首选形式,因为公开字段不好,最好只公开方法 - 那里在 this answer 中解释原因的原因有很多 )

关于c# - readonly 修饰符和 private setter 之间哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com