原文链接: http://blog.csdn.net/shanyongxu/article/details/46765267

数组作为参数

数组可以作为参数传递给方法,也可以从方法中返回.要返回一个数组,只需要把数组声明为返回类型.

static void Main(string[] args)

{

int[] array = { 1, 2, 3, 4, 5, 6 };

PrintArray(new int[] { 1, 2, 3, 4, 5, 6, 7 });

PrintArray(array);

}

static void PrintArray(int[] arr)

{

foreach (var item in arr)

{

Console.WriteLine(item);

}

Console.ReadKey();

}

返回一个数组:

static void Main(string[] args)

{

int[] array = GetArray(new int[] { 1, 2, 3, 4, 5, 6, 7 });

foreach (var item in array)

{

Console.WriteLine(item);

}

Console.ReadKey();

}

static int [] GetArray(int[] arr)

{

return arr;

}

数组协变

数组支持协变,这表示数组可以声明为基类,其派生类型的元素可以赋予数组元素.例如,可以声明一个object[]类型的参数,给它传递一个Person[];

注意:数组协变只能用语音与类型,不能用于值类型.

数组协变有一个问题,它只能通过运行时异常来解决.如果把Person数组赋予object数组,object数组就可以使用派生自object的任何元素.例如,编译器允许把字符串传递给数组元素,但因为object数组引用Person数组,所以会出现一个运行时异常.

ArraySegment<T>

static void Main(string[] args)

{

string[] array = {"zhangsan","lisi","wangwu","zhaoliu" };

//将该数组放到ArraySegment

ArraySegment<string> arrayStr = new ArraySegment<string>(array);

//只能用for输出,不能使用foreach

for (int i = arrayStr.Offset; i < (arrayStr.Offset+arrayStr.Count); i++)

{

Console.WriteLine("    [{0}] : {1}",i,arrayStr.Array[i]);

}

//选取数组中的一段,从下标为1的元素开始,取3个.选取的结果为下标为1,2,3的元素

//ArraySegment<string> subArray = new ArraySegment<string>(array, 1, 3);

Console.ReadKey();

}

多个ArraySegment实例可以引用同一个原始数组,从而可能发生重叠.Array属性返回整个原始数组.而不是该数组的副本.

所以使用: arrayStr.Array[2] = "hahaha";

数组是变成:zhangsan lisi  hahaha  zhaoliu

应用:ArraySegment可以用在内存碎片较多的地方,来减少内存碎片的产生,以便使内存碎片更有序,提高我们的程序性能.

比如Socket.BeginReceive异步接收频繁的时候,我们并不知道要接受的这个buffer长度,所以就预先设置一个固定值,这时候这块内存就会被pin住,一直等到网络硬件接收到数据完成为止,这往往比较容易产生碎片,如果你用windbg一看,!DumpHeap -type Free -stat会有很多objects但是值都是0.所以可以用ArraySegment+Stack来解决

C#编程(三十四)----------数组作为参数的更多相关文章

  1. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  3. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  4. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  6. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  7. 微信小程序把玩(三十四)Audio API

    原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.p ...

  8. FreeSql (三十四)CodeFirst 迁移说明

    FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能. 与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也 ...

  9. 剑指Offer(三十四):第一个只出现一次的字符

    剑指Offer(三十四):第一个只出现一次的字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  10. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

随机推荐

  1. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

  2. 【LOJ】#2128. 「HAOI2015」数字串拆分

    题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...

  3. php 结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...

  4. WinSCP命令行操作

    WinSCP命令行操作     WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件. 直接在cmd下输入 ...

  5. vim/sed/awk/grep等文件批处理总结

    Vim相关操作 1.基础 * 和 # 对对当前光标所在的单词进行搜索 %匹配括号移动,包括 (, {, [ K 查看man手册 ga 查看ascii值 g CTRL-G 统计字数,使用Visual模式 ...

  6. 【转】tair与redis比较总结

    1. Tair总述 1.1 系统架构 一个Tair集群主要包括3个必选模块:configserver.dataserver和client,一个可选模块:invalidserver.通常情况下,一个集群 ...

  7. linux学习笔记-3.文件相关命令

    1.进入到用户根目录 cd ~ 或者 cdcd ~hadoop回到原来路径cd - 2.查看文件详情 stat a.txt 3.移动 mv a.txt /ect/改名mv b.txt a.txt移动并 ...

  8. opesntack 底层共享存储 迁移配置

    底层共享存储在迁移配置: 每台compute 节点都需要配置一下 让nova用户可以登陆 usermod -s /bin/bash nova 设置nova 用户密码 echo "nova&q ...

  9. 每日踩坑 2018-11-26 MVC Razor ActionLink 生成的URL中多生成了一个参数 ?length=n

    RouteConfig 的路由注册如下: routes.MapRoute( name: "Default", url: "{controller}/{action}&qu ...

  10. UOJ.26.[IOI2014]Game(交互 思路)

    题目链接 \(Description\) 有一张\(n\)个点的图.M每次询问\((u,v)\),你需要回答图中\((u,v)\)间是否有边.如果M可以用\(<n(n-1)/2\)次询问确定图中 ...