您好我是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开发人员。提前谢谢
答案 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