c# - 私人设置但仍然可以添加
问题描述
我有这个指定的接口:
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());
}
}
解决方案
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
,那么那将是不必要的工作,并且违反了创建属性的准则。
推荐阅读
- spring - spring integrationflow 没有在receivercontainer 上设置消息监听器
- c# - C# 日期时间格式 YYMMDDhhmmsstnnp
- python - Python密码生成器-密码数组无输出
- ios - 如何在滚动时更新 UITableView 数据
- c# - 如何注册两个实现,然后在 .Net Core 依赖注入中获取一个
- asp.net-core-mvc - 如何在 asp.net core 2.0 中搜索日期
- tensorflow - 时间序列数据作为 X 输入,3d 连续数据作为目标 Y - 使用 RNN 进行回归(LSTM 和 GRU)
- dpdk - DPDK 运行 testpmd 失败。EAL:没有探测到的以太网设备
- python - 枕头数据处理
- c++ - 在 C++ 中用 avx 实现 numpy 的 triu_indices