容器类为(C#)的只读参数
假设我有一个数据容器类容器类为(C#)的只读参数,c#,reference,readonly,data-containers,C#,Reference,Readonly,Data Containers,假设我有一个数据容器类 public class DataContainer { public Person person; } 我们已经创建了这个类的一个实例 DataContainer dataContainer = new DataContainer(); dataContainer.Person = new Person("Smith"); 我们尝试将它传递到一个方法中,我们希望能够只读取容器而不修改它 public void ExampleMethod(in DataC
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关键字,但它对禁止更改容器没有任何效果
注意:将容器转换为结构不是解决方案,因为它将变为不可变的如果您不想修改Person.Name,那么您可以简单地使用封装 我将按照以下方式设计Person类:
class Person
{
public Person(string name)
{
Name = name;
}
public string Name { get; }
}
如果这没有帮助,那么我看到的唯一其他方法就是将一个方法传递给ExampleMethod
(可以使用轻松创建)
var dto=\u mapper.Map(数据容器);
示例法(dto);
...
公共void示例方法(DataContainerTo dataContainer)
{
//没人在乎我是否修改了它,
//因为原始数据容器是完整的
dataConainer.Person.name=“blabla”;
}
这在C语言中是不可能的。不能让对象在某些上下文中显示为不可变,而在其他上下文中显示为可变。我建议将字段本身设置为只读,通过其构造函数对其进行初始化,并在任何地方接受不可变语义。您可以创建两个接口:IImmutablePerson
和immutablePerson
(示例),并让person类实现这两个接口。对于不应该进行更改的方法,请使用不可变契约。@EtienDemartel这里的问题是,我希望其他类能够更改容器中的数据,因此只读字段听起来不太好。。。也许能手和二传手可以做这项工作。。。是否有可能检测到谁获得了财产?限制从那里进入?看起来不错!事实上,也许正是我在寻找的。。。所以我要试试看!谢谢!
var dto = _mapper.Map<DataContainerDto>(dataContainer);
ExampleMethod(dto);
...
public void ExampleMethod(DataContainerDto dataContainer)
{
// Nobody cares if I modify it,
// because the original dataContainer reamains intact
dataConainer.Person.name = "blablabla";
}