Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
容器类为(C#)的只读参数_C#_Reference_Readonly_Data Containers - Fatal编程技术网

容器类为(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";
}