当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET集合接口有没有防止添加对象的?分享

时间:2023-04-11 03:22:29 C#

.NET集合接口有没有防止添加对象的?我有一个类维护另一个类的对象列表。对象列表是公共属性。我想阻止用户像这样直接添加和删除对象列表:MyObject.MyListProperty.Add(object);相反,我希望他们使用一种方法,该方法将在内部进行一些处理,然后将对象添加到列表中。我有一些想法:是否有一些不添加和删除的集合接口?编辑:我将使用ReadOnlyCollection。原因是包装集合可以更新并且只读对象中的更改将立即可见(请参阅ReadOnlyCollection和AsReadOnly()MSDN代码示例)。这允许只读列表的只读创建。IEnumerable的问题是可以将对象转换回原始List并直接操作。您可以使用ReadOnlyCollection-将您的集合包装在其中并将ReadOnlyCollection返回给您班级的用户:returnnewReadOnlyCollection(innerCollection);或者使用List类的AsReadOnly方法:returninnerCollection.AsReadOnly();IEnumerable接口将满足您的需求,因为它只有一个成员GetEnumerator(),它只允许您迭代项目。最简单的选择是通过公共属性将列表公开为以下IEnumerable、ICollectionReadOnlyCollection之一。因此,您可以创建自己的列表类型,将您的项目公开为上述项目之一,但添加了内部方法,例如公共类MyList{私有列表项;publicMyList(){items=newList();}publicIEnumerableItems{get{returnitems.AsEnumerable();}}publicAdd(MyTypeitem){//做内部处理items.Add(item);或许AsReadOnly方法可以解决这个问题,把只读实例给public。否则,IEnumerable没有Add或Remove,所以你可以这样做:privateList_myList;publicIEnumerableMyList{get{returnthis._myList.ToList();我更喜欢IEnumerable(+copy)和ReadOnlyCollection,因为:更改为Thebaselist(从中创建只读集合)将立即出现在您的只读集合中。这可能会导致锁定和straaange问题:)开箱即用,只有IEnumerable将提供此功能,而不会暴露任何可能欺骗客户端获取运行时异常的添加和删除公共方法。如果您希望您的公共API明确声明该集合是只读的并且您想要一个索引器,则必须围绕现有的List或T[]编写自己的包装器。你能给他们一个总是返回可用于访问结构的枚举器的对象吗?如果您决定实施您的两个想法之一,它并没有真正回答您的问题,但它是有用的信息:您可以使用ToArray制作副本并返回一个数组。或者你可以这样做:http://en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Making_Read-Only_Collections_the_Generic_WayICollection(非泛型版本)只获取IEnumerable+Count以上是C#学习教程:有没有.NET集合接口防止添加对象?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: