• 《你不常用的c#之四》:Array的小抽屉ArraySegment


    转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6200060

    一:)略谈
         ArraySegment顾名思义就是Array区块,数组的小抽屉,用于对该数组中元素的范围进行分隔。比如这个数组:

    String[] myArr = { "Overred", "Medloy", "Xiaoguai", "Hare" };  

    我们用ArraySegment这个抽屉给装起来就是:

    ArraySegment<String> arrSeg = new ArraySegment<String>(myArr);  

    只需for一下就可以得出这个小抽屉里的myArr值(不能foreach,ArraySegment无GetEnumerator方法实现)

    for (int i = arrSeg.Offset; i < (arrSeg.Offset + arrSeg.Count); i++)
                {
                    Console.WriteLine("   [{0}] : {1}", i, arrSeg.Array[i]);
                }

    比如我们想取某个区域,可以:

    ArraySegment<String> myArrSegMid = new ArraySegment<String>(myArr, 1, 3);  

    则取myArr的索引从1到3的值。需要注意的是:
           多个 ArraySegment 实例可以引用同一个原始数组,从而可能发生重叠。Array 属性返回整个原始数组,而不是该数组的副本;

    所以:

    arrSeg.Array[2] = "xx";  

    则会导致myArr里的值也发生变化,此时的myArr值则为:

    { "Overred", "Medloy", "xx", "Hare" };  
    二):应用

    应用方面:所以ArraySegment可以用在内存碎片(fragmentation)较多的地方,来减少内存碎片的产生,以便使内存更有序,提高我们的程序性能。比如Socket.BeginReceive异步接收频繁的时候,我们并不知道要接受的这个buffer长度,所以就预先设置一个固定值,这时候这块内存就会被pin住,一直等到网络硬件接收到数据完成为止,这往往比较容易产生碎片,如果你用windbg一看,!DumpHeap -type Free -stat会有很多objects但是值都是0.所以可以用ArraySegment+Stack来解决,我会拿出专门的一节来讲解。

  • 相关阅读:
    java+SpringCloud开发的性能和环保问题
    java基础匿名类/对象
    开发工具eclipse/idea 在运行前执行一些动作
    java基础super关键字
    SpringCloud开发之OpenFeign timeout和压缩等问题
    日志之log4j2和springboot
    dubbogo 连载1
    Builder和Factory设计模式理解
    cm升级
    mysql主备安装及命令
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3406253.html
Copyright © 2020-2023  润新知