首页 / 知识
关于c#:如何公开集合属性?
2023-04-13 15:46:00

How to expose a collection property?每次我创建一个具有collection属性的对象时,我都会以最佳方式来回移动吗? 返回对私有变量的引用 返回并创建新的或克隆的方法 每次对象 IEnumerator和一个set_ObjList 需要IEnumerator 如果集合是数组(即objList.Clone())与列表相比,会有所不同吗? 如果返回实际的集合作为引用非常糟糕,因为它创建了依赖关系,那么为什么要返回任何属性作为参考呢?每当您将子对象作为参考公开时,就可以更改该子对象的内部,而无需父"知道",除非该子对象具有属性更改事件。有内存泄漏的风险吗? 而且,选项2和3不会中断序列化吗?这是一个陷阱22还是您必须在拥有collection属性的任何时候实现自定义序列化? 通用的ReadOnlyCollection似乎是通用的不错的折衷方案。它包装一个IList并限制对其的访问。也许这有助于内存泄漏和序列化。但是它仍然有枚举的问题 也许只是视情况而定。如果您不关心集合是否被修改,则只需按#1将其公开为私有变量上的公共访问器即可。如果您不希望其他程序修改集合,则#2和/或#3更好。 问题的隐含含义是,为什么应该在一种方法之上使用另一种方法,以及在安全性,内存,序列化等方面的后果是什么? 公开集合的方式完全取决于用户与之交互的方式。 1)如果用户要从对象的集合中添加和删除项目,则最好使用简单的仅获取集合属性(原始问题中的选项1):
此策略用于WindowsForms和WPF
WPF还公开了一些可设置的集合,以允许用户显示他们控制的项的集合,例如
请注意,
如果内部集合未实现
这种方法易于实现,并且无需暴露内部集合即可提供对所有成员的访问。但是,这确实需要使集合保持未修改状态,因为如果在修改集合后尝试枚举集合,则BCL集合类将引发异常。如果基础集合可能会更改,则可以创建一个轻包装器来安全地枚举该集合,也可以返回该集合的副本。
您不应通过属性公开基础数组,因为您将无法知道用户何时对其进行修改。要允许修改数组,可以添加相应的
(当然,通过实现自定义索引器,您将复制BCL类的工作:) 我通常会这样做,它是一个返回System.Collections.ObjectModel.ReadOnlyCollection的公共获取器:
并在对象上修改公共方法的集合。
如果该类被认为是供其他人使用的存储库,那么我只是按照方法1公开私有变量,因为它节省了编写自己的API的麻烦,但是我倾向于在生产代码中避免使用它。 ReadOnlyCollection仍然有一个缺点,那就是用户无法确定原始集合不会在不适当的时候被更改。相反,您可以使用不可变集合。如果您需要进行更改,则可以更改原件,而不是更改原件。它的实现方式与可变集合的性能具有竞争力。甚至更好,如果您不必多次复制原始文件,然后再对每个副本进行许多不同(不兼容)的更改。
我建议使用新的 例:
如果需要确保不能从外部操纵该集合,请考虑
避免使用接口 有关此主题的更多信息,可以在此Wiki页面上阅读。 您为什么建议使用ReadOnlyCollection(T)是一个折衷方案?如果仍然需要在原始包装的IList上获得更改通知,则还可以使用ReadOnlyObservableCollection(T)来包装您的集合。在您的方案中,这会不会是一个妥协? 我是Java开发人员,但我认为这对于c#是相同的。
我从不公开私有集合属性,因为程序的其他部分可以在没有父级通知的情况下更改它,因此在getter方法中,我返回了一个包含集合对象的数组,而在setter方法中,我对该集合调用了 如果您只是想在实例上公开一个集合,那么对我的私有成员变量使用getter / setter似乎对我来说是最明智的解决方案(您的第一个建议选项)。 |
最新内容
相关内容
Python集合和时间复杂度
Python集合和时间复杂度,项目,时间,数据,数字,照片,情况,通用,培训,平均,表示,在本文的这一部分中,我将记录CPython中的常见集合,然后概述它们Python类和对象
Python类和对象,代码,培训,对象,实例,定义,关键字,函数,问题,顶层,全名,刚接触python中的类和对象,我也和大多数小伙伴一样迷茫,不知道它和我所Python中JSON 对象有哪些特点?
Python中JSON 对象有哪些特点?,名称,信息,代码,培训,数据,观察,对象,嵌套,数组,特点,JSON对象的结构是什么样子呢?上面代码中的obj就是一个JSPython中的对象
Python中的对象,数据,连续,代码,培训,概念,对象,内存,类型,初始化,静态,Python中一切皆是对象。————GuidovanRossum(1989)这句话只要你学Python查看模块中的属性
Python查看模块中的属性,名称,标准,环境,培训,属性,模块,对象,函数,定义,变量,内置函数dir可用于列出某模块中定义了哪些属性(全局名称空间)列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_Python面向对象的基本概念
Python面向对象的基本概念,概念,信息,位置,新增,培训,属性,鸟类,定义,对象,方法,python使用类(class)和对象(object),进行面向对象(object-oriPython 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在Python 事件对象
Python 事件对象,通信,培训,线程,事件,对象,内部,标志,信号,机制,以上,一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机Python之什么是面向对象?
Python之什么是面向对象?,设计,流程,代码,个体,大唐,对比,培训,模子,上帝,对象,OOP(ObjectOrientedPrograming)编程是利用“类”和“对象”来Python 面向对象的软件开发
Python 面向对象的软件开发,设计,软件,分析,发展,工作,基础,代码,工具,通用,规模,很多人在学完了python的class机制之后,遇到一个生产中的问题Python 信号量对象
Python 信号量对象,时间,培训,计数器,对象,机制,内部,参数,线程,剩余,数量,和锁机制一样,信号量机制也是一种实现线程同步的机制,不过它比锁多