【发布时间】:2020-03-31 21:16:48
【问题描述】:
好吧,假设我有一个数据容器类
public class DataContainer {
public Person person;
}
我们已经创建了这个类的一个实例
DataContainer dataContainer = new DataContainer();
dataContainer.Person = new Person("Smith");
我们尝试将它传递给我们希望能够只读取容器而不是修改的方法
public void ExampleMethod(in DataContainer dataContainer){
dataConainer.Person.name = "blablabla" //we don't want to be able to do that
dataContainer = new DataContainer(); // this is not possible because of in keyword
}
我尝试了 in 关键字,但它对禁止更改容器没有任何影响...
附: : 将容器转换为结构是没有解决办法的,因为它会变得不可变
【问题讨论】:
-
这在 C# 中是不可能的。您不能让对象在某些上下文中显示为不可变,而在其他上下文中显示为可变。我建议将字段本身设为只读,通过其构造函数对其进行初始化,并在任何地方接受不可变语义。
-
您可以创建两个接口:
IImmutablePerson和IMutablePerson(示例)并让您的 person 类实现两者。对于不应该进行更改的方法,请使用不可变合约。 -
@EtiennedeMartel 这里的问题是我希望其他类能够更改容器中的数据,所以只读字段听起来不太好......也许 getter 和 setter 可以做这项工作......是否有可能检测到谁在获得财产?限制从那里访问?
标签: c# reference readonly data-containers