我是C#的新手(第一篇文章),目前正处理有关"封装"的问题。 基本上我有两个这样的类(简化):
class Myclass
{
private List<X> _list;
public List<X> list
{
get
{
return _list;
}
}
...
public Myclass (List<X> input)
{
_list = new List <X>(input);
}
...
}
class Testclass
{
List<X> inputList = new List<X>() {"bla", "bla"};
Myclass myclass = new Myclass(inputlist);
myclass.list.Clear();
List<X> newL = myclass.list;
}
我不应该用第二课改变任何东西&#34; Testclass&#34;。
这是我的问题: myclass.list.Clear()清除公共列表和私有列表。但我只想要清除公共列表或什么也不做,因为最后我需要列出newL来填充私有列表中的项目(通过get-accessor公共列表)。
因为我应该在不触及第二课的情况下解决问题,所以我不知道该怎么做。 我被告知公共名单被称为财产,这是对的吗?如果是这样,公共名单叫什么?
就像我说的那样,我在编程方面非常糟糕/很新(19岁)所以非常感谢初学友好的答案!
答案 0 :(得分:2)
IEnumerable<T>
每次都会返回列表的副本。因此,从外部来看,调用者永远无法访问内部的真实列表。他可以随意复制任何他想要的东西,清除,添加,删除。它不会改变私人名单。
请注意,在实际生产代码中,您需要将属性更改为不返回列表,而是没有更改它的选项(如libraryDependencies += "ws.securesocial" % "securesocial_2.11" % "2.1.4.1-for-play24"
) 。给某人一个 List 然后忽略他用它做的任何事情对于调用者来说是非常不直观的,并且不是很好的编程。
答案 1 :(得分:1)
当通过您的属性访问列表时,它是列表的实例,它存储在您的(backing-)字段中,因此两个列表都是同一个对象。这就是你在场上调用Clear
的原因。要以只读方式提供列表,您有两种可能性:
您可以克隆列表:这样,返回的列表不是同一个对象,但具有与原始列表相同的元素。示例:return _list.ToList();
或return new List(_list);
您可以使用ReadOnlyCollection<T>
。这就像名称所示,只读,所以没有人可以添加或删除项目。