【C#食谱】【面食】菜单3:用泛型替代ArrayList

问题:

你希望用泛型替代所有的ArrayList以提高应用程序的性能,并使代码更简单。当你发现结构体或其他类型的值保存在这些数据结构中,导致装箱/拆箱操作时,这个是必要的。

解决方法:

把所有出现System.Collections.ArrayList的类用效能更好的泛型System.Collections.Generic.List类替代。

这里有一个用System.Collections.ArrayList类的简单的例子:


    public static void UseNonGenericArrayList()
    
{
        
// Create and populate an ArrayList.
        ArrayList numbers = new ArrayList();
        numbers.Add(
1); // Causes a boxing operation to occur
        numbers.Add(2); // Causes a boxing operation to occur

        
// Display all integers in the ArrayList.    
        
// Causes an unboxing operation to occur on each iteration
        foreach (int i in numbers)
        
{
            Console.WriteLine(i);
        }


        numbers.Clear();
    }

这里是一个用System.Collections.Generic.List的简单例子:


    public static void UseGenericList()
    
{
        
// Create and populate a List.
        List<int> numbers = new List<int>();
        numbers.Add(
1);
        numbers.Add(
2);

        
// Display all integers in the ArrayList.
        foreach (int i in numbers)
        
{
            Console.WriteLine(i);
        }


        numbers.Clear();
    }

讨论:

由于ArrayList几乎在所有的应用程序中都会用到,因此,这是第一个可以改善性能的好地方。在一些简单的应用程序中,用这种替代方法实现ArrayList是非常简单的。但是,有几点是应该值得注意的。比如,泛型List类并没有实现ICloneable接口,而ArrayList类实现了。

注意,如果没有返回一个同步版本的泛型List,没有返回确定大小的泛型List,那么IsFixedSizeIsSynchronized属性将始终返回falseSyncRoot属性将始终返回一个和它相同的对象。实际上,这个属性返回的是this指针。微软建议,使用lock关键字去锁定整个集合或者是其他你使用的同步的对象。

PSArrayList默认的构建大小是16个元素,而List<T>4个元素。也就是说,如果第17个元素被加到List<T>中,那么,List<T>会重新分配大小3次;而ArrayList只需1次。对于程序的性能,这一点是应该考虑的。


新年就要到了,祝大家新春愉快! 

汇聚杭州外卖:外卖汇
Tag标签: C#,泛型
posted @ 2008-02-01 17:35 随风逝去(叶进) 阅读(1922) 评论(9)  编辑 收藏 所属分类: A. C#.NETB. 个人翻译

  回复  引用    
#1楼 2008-02-01 18:15 | 劲舞团 [未注册用户]
也祝BLOG主新年块乐
  回复  引用  查看    
#2楼 2008-02-01 20:56 | overred      
明就回家喽。。。
  回复  引用  查看    
#3楼 [楼主]2008-02-01 21:49 | 随风逝去      
@overred
偶后天回!
  回复  引用    
#4楼 2008-02-02 16:30 | htwind [未注册用户]
看了之后,反而不知道是改良还是拖累了性能。。。
  回复  引用    
#5楼 2008-02-02 17:55 | 小兵a [未注册用户]
学习
  回复  引用  查看    
#6楼 [楼主]2008-02-02 18:00 | 随风逝去      
@htwind
拆装箱的性能开销是ArrayList的大(泛型不用这个);而如果插入很多的话,那么泛型List的重新分配空间的开销比ArrayList大。
  回复  引用  查看    
#7楼 2008-02-04 02:15 | jade zhao      
乱讲一通,不要误人子弟了从那书上Down的资料都不仔细研究纯粹一个吃白食的家伙。文中的Ps:段讲解完全错误 程序英文注释文法完全错误
好好学习一个ArrayLisT 和 LIst在 超出引用范围和值范围的工作机制原理

  回复  引用  查看    
#8楼 2008-02-26 21:13 | 腊八粥      
--引用--------------------------------------------------
随风逝去: @htwind
拆装箱的性能开销是ArrayList的大(泛型不用这个);而如果插入很多的话,那么泛型List的重新分配空间的开销比ArrayList大。
--------------------------------------------------------
我觉得这有问题:插入很多元素这个开销不应该算在默认构建大小的头上。
  回复  引用  查看    
#9楼 2008-09-18 16:43 | 飞林沙      
ps处讲解有误

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-02-02 10:26 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
 
Free Web Counter
Free Web Counter