清除属性 - (公共)列表而不清除私人列表(新手)

时间:2017-01-02 15:53:17

标签: c# list private encapsulation clear

我是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岁)所以非常感谢初学友好的答案!

2 个答案:

答案 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>。这就像名称所示,只读,所以没有人可以添加或删除项目。