清除 属性-(public) 列表而不清除私有列表
Clear property-(public) List without clearing the private List
我是 C# 的新手(第一次 post),目前正在处理有关 "encapsulation" 的问题。
基本上我有两个这样的 classes(简化):
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;
}
我不应该对第二个 class "Testclass" 进行任何更改。
这是我的问题:
myclass.list.Clear() 清除 public 列表和私有列表。但我只希望它清除 public 列表或什么都不做,因为最后我需要列表 newL 来填充私有列表中的项目(public 列表通过 get-accessor ).
因为我应该在不触及第二个的情况下解决问题class我不知道该怎么做。
有人告诉我 public 列表称为 属性,对吗?如果是这样,public 列表叫什么?
就像我说的,我在一般编程方面 bad/new 很漂亮 (19 y/o),所以非常感谢对初学者友好的回答!
public List<X> list
{
get
{
return new List<X>(_list);
}
}
这每次都会return 复制 列表。因此,从外部来看,调用者永远无法访问内部的 real 列表。他可以随心所欲地处理副本,清除、添加、删除。它不会改变私有列表。
请注意,在实际生产代码中,您可以将 属性 更改为不是 return 列表,而是 没有 更改它的选项(如 IEnumerable<T>
)。给某人一个 List 然后忽略他用它做的任何事情对于调用者来说是非常不直观的并且不是很好的编程。
当通过您的 属性 访问列表时,它是列表的实例,存储在您的 (backing-) 字段中,因此两个列表是同一个对象。这就是为什么你的 Clear
在场上被点名的原因。要以只读方式传送列表,您有两种可能性:
您可以克隆列表:这样,返回的列表不是同一个对象,但具有与原始列表相同的元素。示例:return _list.ToList();
或 return new List(_list);
你可以使用一个ReadOnlyCollection<T>
。顾名思义,这是只读的,因此没有人可以添加或删除项目。
我是 C# 的新手(第一次 post),目前正在处理有关 "encapsulation" 的问题。 基本上我有两个这样的 classes(简化):
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;
}
我不应该对第二个 class "Testclass" 进行任何更改。
这是我的问题: myclass.list.Clear() 清除 public 列表和私有列表。但我只希望它清除 public 列表或什么都不做,因为最后我需要列表 newL 来填充私有列表中的项目(public 列表通过 get-accessor ).
因为我应该在不触及第二个的情况下解决问题class我不知道该怎么做。 有人告诉我 public 列表称为 属性,对吗?如果是这样,public 列表叫什么?
就像我说的,我在一般编程方面 bad/new 很漂亮 (19 y/o),所以非常感谢对初学者友好的回答!
public List<X> list
{
get
{
return new List<X>(_list);
}
}
这每次都会return 复制 列表。因此,从外部来看,调用者永远无法访问内部的 real 列表。他可以随心所欲地处理副本,清除、添加、删除。它不会改变私有列表。
请注意,在实际生产代码中,您可以将 属性 更改为不是 return 列表,而是 没有 更改它的选项(如 IEnumerable<T>
)。给某人一个 List 然后忽略他用它做的任何事情对于调用者来说是非常不直观的并且不是很好的编程。
当通过您的 属性 访问列表时,它是列表的实例,存储在您的 (backing-) 字段中,因此两个列表是同一个对象。这就是为什么你的 Clear
在场上被点名的原因。要以只读方式传送列表,您有两种可能性:
您可以克隆列表:这样,返回的列表不是同一个对象,但具有与原始列表相同的元素。示例:
return _list.ToList();
或return new List(_list);
你可以使用一个
ReadOnlyCollection<T>
。顾名思义,这是只读的,因此没有人可以添加或删除项目。