zoukankan      html  css  js  c++  java
  • C#编程之IList、List和ArrayList

    额。。。今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别。。。
     在C#中,数组、ArrayList都能够存储一组对象,那么三者到底有什么样的区别呢?

    数组

    数组在C#中最早出现的。在内存中是连续的,所以它的索引速度非常快,而且赋值与修改元素也很简单。
    string[] s=new string[2];
    
    //赋值
    s[0]="a";
    s[1]="b";
    //修改
    s[1]="a1";
    
            但是数组存在一些不足的地方。在数组的两个数据间插入数据是非常麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长会造成内存浪费,过短会造成数据溢出。如果在声明数组时我们不清楚数组的长度就会很麻烦。

    ArrayList

            针对数组的这些缺点,C#中最先提供了ArrayList对象来解决这些问题。
            ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照存储的数据来动态扩充与收缩的。所以在声明ArrayList对象时并不需要指定它的长度。
    ArrayList list1 = new ArrayList();
    
    //新增数据
    list1.Add("cde");
    list1.Add(5678);
    
    //修改数据
    list[2] = 34;
    
    //移除数据
    list.RemoveAt(0);
    
    //插入数据
    list.Insert(0, "qwe");
    
           从上面的例子看,ArrayList好像解决了数组中所有的缺点,为什么又会有List?
           我们从上面的例子看,在List中,我们不仅插入了字符串cde,而且插入了数字5678。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把插入其中的数据当object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱的操作,带来很大的性能损耗。
           装箱与拆箱的概念:
           简单的说:
           装箱:就是将值类型的数据打包到引用类型的实例中
           比如将string类型的值赋值abc赋给object对象obj
    String  i=”abc”;
    object obj=(object)i;
    
           拆箱:就是从引用数据中提取值类型
           比如将object对象obj的值赋值给string类型的变量i
    object obj=”abc”;
    string i=(string)obj;
    
           装箱与拆箱的操作是非常耗性能的。

    泛型List

           因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内的对象类型。
    List<string> list = new List<string>();
    
    //新增数据
    list.Add(“abc”);
    
    //修改数据
    list[0] = “def”;
    
    //移除数据
    list.RemoveAt(0);
    
    上例中如果我们往List集合中插入int数组123,IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

    总结

          数组的容量是固定的,只能一次获取或设置一个元素的值,而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除、或插入数据。
          数组可以具有多个维度,而ArrayhuoList<T>始终只有一个维度。但是,可以轻松的创建数组列表或列表的列表。特定类型(Object除外)的数组的性能优于ArrayList的性能。这事因为ArrayList的元素属于Object类型;所以在存储或检索值类型时通常发生装箱和拆箱的操作。不过,在不需要重新分配时(即最初容量十分接近列表的最大容量),List<T>的性能与同类型的数组十分相近。
          在决定使用List<T>还是使用ArrayList类(两者具有相似的功能)时,记住List<T>类在大多数情况下执行的更好并且是类型安全的。如果对List<T>类的类型T使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱的问题。
  • 相关阅读:
    jquery animate()方法 语法
    jquery unload方法 语法
    jquery undelegate()方法 语法
    jquery unbind()方法 语法
    jquery trigger() 方法 语法
    jquery toggle()方法 语法
    jquery change() 函数 语法
    jquery blur()函数 语法
    jquery bind()方法 语法
    jquery checked选择器 语法
  • 原文地址:https://www.cnblogs.com/haxianhe/p/9271198.html
Copyright © 2011-2022 走看看