博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《你不常用的c#之四》:Array的小抽屉ArraySegment
阅读量:4622 次
发布时间:2019-06-09

本文共 1118 字,大约阅读时间需要 3 分钟。

转载自csdn:

一:)略谈

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

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

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

ArraySegment
arrSeg = new ArraySegment
(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
myArrSegMid = new ArraySegment
(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来解决,我会拿出专门的一节来讲解。

转载于:https://www.cnblogs.com/zhaox583132460/p/3406253.html

你可能感兴趣的文章
20、docker swarm
查看>>
psp工具软件前景与范围文档
查看>>
day06-三元表达式
查看>>
C# DateTime.Now详细用法
查看>>
Php中"{}"大括号的用法总结(转)
查看>>
JavaScript内存优化
查看>>
BZOJ1059: [ZJOI2007]矩阵游戏(二分图匹配)
查看>>
P3385 【模板】负环
查看>>
URI、URL 和 URN的区别
查看>>
根据表达式序列(前缀、中缀、后缀)构建表达式树
查看>>
mysql性能优化
查看>>
【SqlServer系列】语法定义符号解析
查看>>
Color Length UVA - 1625
查看>>
TLS/SSL
查看>>
webpack笔记(4)对图片的处理
查看>>
如果判断一个dom 对像?
查看>>
搜索引擎的反作弊问题
查看>>
nginx lua 01
查看>>
计算机网络 chapter 8 因特网上的音频/视频服务
查看>>
c++输入输出流读取文件
查看>>