防止修改C#

时间:2017-07-20 06:20:56

标签: c#

您好我是C#开发环境的新手。谁能帮我。

  

修改Coffee类实现,以便通过修改原始列表或恢复列表来影响存储在Coffee中的列表。

using System;
using System.Collections.Generic

public class Coffee 
{
    private List<int> info;
    public Coffee(List<int> info)
    {
      this.info = info;
    }
    public List <int> Restore()
    {
      return this.info;
    }
}

我不是在这里寻找答案(勺子喂食)而是方向,我应该阅读什么。我是一名PHP开发人员。提前谢谢

4 个答案:

答案 0 :(得分:2)

您可以使用LINQ制作列表的副本,方法是在路上添加.ToList()(这样您就拥有了不受原始更改影响的副本)和出路(因此调用者获得自己的副本,因此他们的更改不会影响你)

using System;
using System.Collections.Generic

public class Coffee 
{
    private List<int> info;
    public Coffee(List<int> info)
    {
      this.info = info.ToList();
    }
    public List <int> Restore()
    {
      return this.info.ToList();
    }
}

答案 1 :(得分:0)

创建List

的新实例
Using System;
Using System.Collections.Generic

public class Coffee 
{
    private List<int> info;
    public Coffee(List<int> info)
    {
       this.info = new List<int>(info);
    }
    public List <int> Restore()
    {
       return new List<int>(this.info);
    }
}

答案 2 :(得分:0)

如果您使用的是现代.NET版本,一种方法是返回一个ReadOnlyCollection<T>对象 - 这是您的集合的包装器,如果您尝试修改它,将会抛出异常。 List<T>.AsReadOnly()创建了这个包装器。但它并非静态类型安全 - 它不会阻止您编写错误的代码。它肯定不会阻止某人自己修改元素:roList[3].name = "foo";

另一种方法是复制列表。这是安全的,适用于较旧的.NET版本,但有开销。插入元素时,将修改新列表。由于它不是深层副本,因此可以像上一个示例一样更改元素。

第三种可能性是在返回之前将对象强制转换为IEnumerable<T>,它根本没有列表访问器API。您仍然可以使用foreach循环遍历元素。除非将对象强制转换回List<T>,否则这实际上会阻止您编写非法代码。这将使使用列表的代码更慢,编写更不方便,因为API比List<T>更受限制。

这些方法都不使用深层复制,这是防止对象修改的唯一真正安全的方法。由于深层复制对于许多类型的对象是不可能的,因此它不是一个可行的解决方案。

答案 3 :(得分:-2)

您可以将其存储为IReadOnlyList<int>

public class Coffee
{
    private IReadOnlyList<int> info;
    public Coffee(List<int> info)
    {
        this.info = info; // You can view original collection in readonly mode
    }
    public List<int> Restore()
    {
        return info.ToList(); // Makes a copy of original list
    }
}

更新:抱歉遗失的条件。如果您想存储列表的独立副本,您可以使用Colin Mackay的解决方案。

PS:不需要如此积极,立即向每个答案投票。此代码示例也可用于了解C#for newcomer