首页 / 知识
关于c#:何时使用IList以及何时使用List
2023-04-12 13:55:00

When to use IList and when to use List我知道i list是接口,list是具体的类型,但我仍然不知道何时使用每种类型。我现在要做的是,如果我不需要使用接口的sort或findall方法。我说的对吗?是否有更好的方法来决定何时使用接口或具体类型? 我遵循两条规则:
因此,在编写接受集合的函数或方法时,编写它不是为了获取列表,而是为了获取IList、ICollection或IEnumerable。即使对于异类列表,通用接口仍然可以工作,因为System.Object也可以是T。如果您决定使用堆栈或其他数据结构,那么这样做可以避免您的头痛。如果您在函数中需要做的只是通过它来实现foreach,那么IEnumerable 另一方面,当从函数中返回一个对象时,您希望为用户提供尽可能丰富的操作集,而不必进行强制转换。因此,在这种情况下,如果它是一个内部列表,返回一个作为列表的副本。 由fxcop检查的Microsoft指南不鼓励在公共API中使用list 顺便说一下,我现在几乎总是将一维数组声明为ilist
人们总是忽略一件重要的事情: 可以将一个普通数组传递给接受 例如,考虑以下代码:
如果按如下方式调用,则会得到运行时异常:
这是因为使用带有 因此,如果您打电话给 我同意李的建议,接受参数,但不返回。 如果您指定方法来返回一个接口,这意味着您可以在以后自由地更改确切的实现,而不必知道消耗方法。我认为我不需要从列表中进行更改,但后来必须进行更改才能使用自定义列表库来提供额外的功能。因为我只返回了一个ilist,所以使用库的人都不需要更改代码。 当然,这只需要应用于外部可见的方法(即公共方法)。我个人甚至在内部代码中也会使用接口,但由于您能够自己更改所有代码,所以如果您进行破坏性的更改,这并不是严格必要的。 可枚举的您应该尝试使用最不具体的类型来满足您的目的。IEnumerable不如IList具体当要循环访问集合中的项时,可以使用IEnumerable。 伊利斯特IList实现IEnumerable当需要按索引访问集合、添加和删除元素等时,应使用ilist。 表列表实现IList 最好使用尽可能低的基类型。这就给了界面的实现者,或者方法的使用者,在幕后使用他们喜欢的任何东西的机会。 对于集合,应尽可能使用IEnumerable。这提供了最大的灵活性,但并不总是适合的。 如果您在一个方法内工作(或者在某些情况下甚至在一个类或程序集内工作),而外部没有人会看到您在做什么,那么使用列表的完整性。但是,如果您正在与外部代码交互,比如当您从方法返回列表时,那么您只希望声明接口,而不必将自己绑定到特定的实现,特别是如果您无法控制之后谁编译代码。如果您从一个具体的类型开始,并决定改为另一个类型,即使它使用相同的接口,除非您从一个接口或抽象基类型开始,否则您将破坏其他人的代码。 使用最通用的可用类型(在本例中是IList,甚至更好的是IEnumerable接口)通常会更好,以便以后方便地切换实现。 然而,在.NET 2.0中,有一件烦人的事情-ilist没有sort()方法。您可以使用提供的适配器:
我不认为这类事情有硬性和快速性的规则,但我通常以尽可能轻的方式进行指导,直到绝对必要为止。 例如,假设您有一个
而且,如果您甚至不需要 a list对象允许您创建一个列表,向其添加内容,删除它,更新它,索引到它等等。只要您想要一个通用列表,在其中指定对象类型,就可以使用列表。 另一方面,IList是一个接口。基本上,如果您想创建自己的列表类型,比如一个名为booklist的列表类,那么您可以使用该接口为新类提供基本的方法和结构。当您想创建自己的实现列表的特殊子类时,可以使用IList。 另一个区别是:IList是接口,无法实例化。列表是一个类,可以实例化。它的意思是:
您应该仅在需要时使用该接口,例如,如果您的列表被强制转换为列表以外的IList实现。例如,当您使用nhibernate时,这是正确的,它在检索数据时将ilist强制转换为nhibernate包对象。 如果列表是您将用于某个集合的唯一实现,那么可以将其声明为具体的列表实现。 在我经常遇到的情况下,我很少直接使用ilist。 通常我只是用它作为方法的参数
这将允许我对.NET框架中的几乎任何数组执行一般处理,除非它使用IEnumerable而不是IList,这有时会发生。 它实际上取决于您需要的功能类型。我建议在大多数情况下使用List类。当您需要创建一个自定义数组时,IList是最好的选择,它可能具有一些非常具体的规则,您希望将这些规则封装在集合中,这样您就不会重复自己的操作,但仍然希望.NET将其识别为列表。 |
最新内容
相关内容
python有map方法吗
python有map方法吗,培训,位置,数据,函数,列表,序列,参数,元素,方法,使用方法,python中的map:map()会根据提供的函数对指定序列做映射。第一个pythondict是什么类型
pythondict是什么类型,培训,数字,字典,类型,数据类型,冒号,括号,逗号,字符串,容器,python中的dict表示的字典数据类型。字典是另一种可变容器python 培训之 object是什么类型
python 培训之 object是什么类型,培训,类型,实例,顶端,对象,关系,链条,父子,数据类型,属性,在Python的世界中,object是父子关系的顶端,所有的数python声明变量类型
python声明变量类型,培训,代码,基础,变量,赋值,类型,字符串,语句,函数,上面,对于没有编程基础的读者,可以先不编写真正的Python程序,而是先打开pythonPython是强类型还是弱类型
pythonPython是强类型还是弱类型,培训,代码,标准,类型,语言,变量,脚本语言,解释性,动态,赋值,python是强类型的动态脚本语言。强类型:不允许不python有哪些方法可以解压文件?
python有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大。python怎么判断元素类型
python怎么判断元素类型,培训,类型,函数,实例,元素,对象,字符串,变量,字典,语法,Python中的元素类型常见的有列表,字典,元组,字符串,布尔值,Nonepython类自带方法吗
python类自带方法吗,培训,方法,里面,实例,也就是说,下面,对象,以上,之后,参数,python中的类,创建好之后,里面是没有方法的,也就是说,类并没有自带python子类可以调用父类方法吗
python子类可以调用父类方法吗,培训,名称,资料,情况,地方,函数,参数,方法,表示,语句,python中的子类中的__init__()函数会覆盖父类的函数,一些python静态方法怎么使用self
python静态方法怎么使用self,培训,管理,不了,方法,静态,属性,实例,变量,对象,参数,python-静态方法,类方法,属性方法静态方法实际上与类(或者实python怎么理解Python的构造方法
python怎么理解Python的构造方法,代码,名字,培训,方法,参数,对象,以上,结尾,函数,开头,在创建类时,我们可以手动添加一个__init__()方法,该方法python列表操作的函数和方法
python列表操作的函数和方法,培训,位置,列表,元素,操作,函数,末尾,方法,对象,以下,1列表操作包含以下函数:21、cmp(list1,list2):比较两个列表