首页 > 解决方案 > 私人设置但仍然可以添加

问题描述

我有这个指定的接口:

public interface IMyInter
{
   ObservableCollection<Data> files{ get; }
}

我消费接口:

public class Class1 : IMyInter
{
   public ObservableCollection<Data> files{ get; private set; }

   void DoSomething()
   {
       files = new ObservableCollection<Data>();
       files.Add(new Data());
       files.Add(new Data());
   }
}

为什么在 Class2 中仍然有 Add() 的可能性,因为在接口文件中只能获取?目标是 Class2 应该只能读取集合而不能修改它。

public class Class2
{
   Class2(IMyInter inter)
   {
       inter.files.Add(new Data());
   }
}

标签: c#

解决方案


ObservableCollection<Data> files { get; }说消费者只被允许获得那个属性,他们不能设置它。然而,一旦他们得到它,他们就可以为所欲为。

所以这是不允许的:

inter.files = new ObservableCollection<Data>();

但这是:

var files = inter.files;

一旦他们得到files,他们就可以.Add().Clear(),或其他任何东西。

如果你想阻止人们修改集合,你需要暴露一些不能修改的东西。在这种情况下,这可能是IReadOnlyList<Data>ReadOnlyObservableCollection<Data>,这取决于您是否希望消费者能够订阅该CollectionChanged事件。

因此,您可能需要如下所示的代码:

public interface IMyInter
{
    ReadOnlyObservableCollection<Data> files { get; }
}

public class Class1 : IMyInter
{
    private readonly ObservableCollection<Data> _files = new ObservableCollection<Data>();
    public ReadOnlyObservableCollection<Data> files { get; } = new ReadOnlyObservableCollection<Data>(_files);

    void DoSomething()
    {
         _files.Add(new Data());
    }
}

注意我是如何_files只读的,所以只有一个ObservableCollection分配给它的实例。然后我创建一个ReadOnlyObservableCollection包装它的单曲,并暴露给消费者。当我想添加项目时,我将它们添加到_files.

如果我们允许_files重新分配,那么files最终可能会引用ObservableCollection我们不再使用的旧数据,而消费者将看不到最新数据。如果我们ReadOnlyObservableCollection每次消费者访问时都生成一个新的files,那么那将是不必要的工作,并且违反了创建属性的准则。


推荐阅读