您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 三层架构.NET资料
List和IList的区别常见问题:IList本身只是一个泛型接口,既然是接口当然不能实例化,只能用如下方法:IListClass1IList11=newListClass1();但是为什么要这么用呢,为什么不直接用List:ListClass1List11=newListClass1();第一种用法有什么好处。总结归纳一下:Ilist是在.net2.0里面才支持的好处嘛..比如说human和tiger都有行走的功能,你可以把这些归类到interface中,当你有一个动物的类包括有这两种动物时,你想让他们行走你只需要调一个同样的方法而不管对方是什么类型,具体的行走嘛,人有两个只脚,但有4肢,动物有4条腿,这就是到具体的动物类来实现了,但是他们行走时都是4肢摆动,而且都向前迈出一定的距离(当然是向前走时),所以我认为这些可以归类为行为抽象,具体的一步能迈出多远这依赖于每个具体实现的身高/体长.使用IListClass1IList11=newListClass1();方便后期的修改,当你不在使用List要使用其他类型的时候只需要修改这一处地方就可以了不用修改过多的地方IList是个接口,定义了一些操作方法这些方法要你自己去实现List是个类型已经实现了IList定义的那些方法ListClass1List11=newListClass1();是想创建一个ListClass1,而且需要使用到ListT的功能,进行相关操作。而IListClass1IList11=newListClass1();只是想创建一个基于接口IListClass1的对象的实例,只是这个接口是由ListT实现的。所以它只是希望使用到IListT接口规定的功能而已。再举一个例子,比如你要实现一个集合类,但是你认为添加的时候要做一下判断,不能重复,你可以这样做://方法1:publicclassMyCollection1:ListMyItem{publicnewvoidAdd(MyItemitem){if(this.Contains(item))return;base.Add(item);}}//方法2:publicclassMyCollection2:IListMyItem{privateListMyIteminnerList=newListMyItem();publicvoidAdd(MyItemitem){if(this.Contains(item))return;base.Add(item);}//实现n多的方法后,附带的,有个Add方法,实现即可,实现方法略}如果是从List继承而来,那我如果这样写,就能跳过检查了。但是不会调用你写的Add方法,而是调用List的Add方法。MyCollection1mc1=newMyCollection1();.....System.Collection.IListlistData=mc1;listData.Add(listData[0]);这样就不会执行你写的检查代码。但如果用下面方法,则会执行你写的Add方法:MyCollection2mc2=newMyCollection2();.....System.Collection.IListlistData=mc2;listData.Add(listData[0]);总之,正如那些高手说的:接口实现松耦合...有利于系统的维护与重构...优化系统流程...所以鼓励使用接口,这样可以实现功能和具体实现的分离实现接口分离的原则不是看实际需要用的!Tag标签:List,IList,区别说说C#中IList与List区别首先IList泛型接口是ICollection泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IListT可以胜任。不过,更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IListT就爱莫能助了。1、当你只想使用接口的方法时,ILis这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.2、IList是个接口,定义了一些操作方法这些方法要你自己去实现List是泛型类,它已经实现了IList定义的那些方法IListClass1IList11=newListClass1();ListClass1List11=newListClass1();这两行代码,从操作上来看,实际上都是创建了一个ListClass1对象的实例,也就是说,他们的操作没有区别。只是用于保存这个操作的返回值变量类型不一样而已。那么,我们可以这么理解,这两行代码的目的不一样。ListClass1List11=newListClass1();是想创建一个ListClass1,而且需要使用到ListT的功能,进行相关操作。而IListClass1IList11=newListClass1();只是想创建一个基于接口IListClass1的对象的实例,只是这个接口是由ListT实现的。所以它只是希望使用到IListT接口规定的功能而已。正则表达式正则表达式(英文:RegularExpression)在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具裡,正則表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正則表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正則表达式引擎。正則表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。[编辑]譯名問題RegularExpression的「Regular」一般被譯為「正则」、「正規」、「常規」。此處的「Regular」即是「規則」、「規律」的意思,RegularExpression即「描述某種規則的表達式」之意。[编辑]基本概念一個正则表达式通常被稱為一個模式(pattern),為用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、Händel和Haendel這三个字符串,都可以由「H(a|ä|ae)ndel」这个模式来描述。大部分正则表达式的形式都有如下的结构:选择|竖直分隔符代表选择。例如「gray|grey」可以匹配grey或gray。数量限定某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”、“?”和“*”(不加数量限定则代表出现一次且仅出现一次):+加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,「goo+gle」可以匹配google、gooogle、goooogle等;?问号代表前面的字符最多只可以出现一次。(0次、或1次)。例如,「colou?r」可以匹配colour或者color;*星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,「0*42」可以匹配42、042、0042、00042等。匹配圆括号可以用来定义操作符的范围和优先度。例如,「gr(a|e)y」等价于「gray|grey」,「(grand)?father」匹配father和grandfather。上述这些构造子都可以自由组合,因此,「H(ae?|ä)ndel」和「H(a|ae|ä)ndel」是相同的。精确的语法可能因不同的工具或程序而异。[编辑]历史最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。1940年代,WarrenMcCulloch与WalterPitts将神经系统中的神经元描述成小而简单的自动控制元。在1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。自此,正則表达式被广泛地使用于各种Unix或者类似Unix的工具,例如Perl。Perl正则表达式源自于HenrySpencer写的regex,它已经演化成了pcre(Perl兼容正则表达式,PerlCompatibleRegularExpressions),一个由PhilipHazel开发的,为很多现代工具所使用的库。各计算机语言之间的正則表达式的整合目前开展的很差。未来的Perl6的子项目Apocalypse的设计中已考虑到了这点。[编辑]形式化语言理论正则表达式可以用形式化语言理论的方式来表达。正则表达式由常量和算子组成,它们分别指示字符串的集合和在这些集合上的运算。给定有限字母表Σ定义了下列常量:(“空集”)∅指示集合∅(“空串”)ε指示集合{ε}(“文字字符”)在Σ中的a指示集合{a}定义了下列运算:(“串接”)RS指示集合{αβ|α∈R∧β∈S}。例如{ab|c}{d|ef}={abd,abef,cd,cef}。(“选择”)R|S指示R和S的并集。(“Kleene星号”)R*指示包含ε并且闭包在字符串串接下的R的最小超集。这是可以通过R中的零或多个字符串的串接得到所有字符串的集合。例如,{ab,c}*={ε,ab,c,abab,abc,cab,cc,ababab,...}。上述常量和算子形成了克莱尼代数。很多课本使用对选择使用符号∪,+或∨替代竖杠。为了避免括号,假定Kleene星号有最高优先级,接着是串接,接着是并集。如果没有歧义则可以省略括号。例如,(ab)c可以写为abc而a|(b(c*))可以写为a|bc*。例子:a|b*指示{ε,a,b,bb,bbb,...}。(a|b)*指示由包括空串、任意数目个a和b字符组成的所有字符串的集合。ab*(c|ε)指示开始于一个a接着零或多个b和最终可选的一个c的字符串的集合。正则表达式的形式定义故意非常精简,避免定义多余的量词?和+,它们可以被表达为:a+=aa*和a?=(a|ε)。有时增加补算子~;~R指示在Σ*上的不在R中的所有字符串的集合。补算子是多余的,因为它使用其他算子来表达(尽管计算这种表示的过程是复杂的,而结果可能指数性的增大)。这种意义上的正则表达式可以表达正则语言,精确的是可被有限状态自动机接受的语言类。但是在简洁性上有重要区别。某类正则语言只能用大小指数增长的自动机来描述,而要求的正则表达式的长度只线性的增长。正则表达式对应于乔姆斯基层级的类型-3文法。在另一方面,在正则表达式和不导致这种大小上的爆炸的非确定有限状态自动机(NFA)之间有简单的映射;为此NFA经常被用作正则表达式的替代表示。我们还要在这种形式化中研究表达力。如下面例子所展示的,不同的正则表达式可以表达同样的语言:这种形式化中存在着冗余。有可能对两个给定正则表达式写一个算法来判定它们所描述的语言是否本质上相等,简约每个表达式到极小确定有限自动机,确定它们是否同构(等价)。这种冗余可以消减到什么程度?我们可以找到仍有完全表达力的正则表达式的有趣的子集吗?Kleene星号和并集明显是需要的,但是我们或许可以限制它们的使用。这提出了一个令人惊奇的困难问题。因为正则表达式如此简单,没有办法在语法上把它重写成某种规范形式。过去公理化的缺乏导致了星号高度问题。最近DexterKozen用克莱尼代数公理化了正则表达式。很多现实世界的“正则表达式”引擎实现了不能用正则表达式代数表达的特征。[编辑]表达式全集正则表达式有多種不同的风格。下表是在PCRE中元字符及其在正则表达式上下文中的行为的一个完整列表:字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,「n」匹配字
本文标题:三层架构.NET资料
链接地址:https://www.777doc.com/doc-4390164 .html