原文链接: 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. 页面跳转时中间参数保存(memcache/cookie)

    2014年1月19日 17:30:27 我这篇文章就说了一句话:用cookie保存页面间跳转时的参数 情景: 客服在后台操作的时候,经常从列表页进入到编辑页,编辑完信息后,还要自动返回之前的列表页 问 ...

  2. MVC5使用EF6 Code First--创建EF数据模型(一)

    此Web应用程序演示如何使用Entity Framework 6和Visual Studio 2015创建ASP.NET MVC 5应用程序.本教程使用“Code First ”即代码先行.有关如何在 ...

  3. java实现xml格式与javabean之间的转换XmlUtil类

    XmlUtil类:不多说,直接撸代码: /** * java 转换成xml * @Title: toXml * @Description: TODO * @param obj 对象实例 * @retu ...

  4. DNS的服务器和客户端的配置

    内网环境Linux发行版本均采用centos为主,centos下DNS服务端的搭建步骤如下: DNS master节点搭建步骤: 安装组件: yum install bind;      yum in ...

  5. Servlet 3.0 新特性详解

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/#major3 Servlet 是 Java EE 规范体系的重要组成部分,也是 ...

  6. pycharm+PyQt5+python最新开发环境配置

    Python 3.6https://www.python.org/downloads/windows/========================================PyQt5 pip ...

  7. Java ArrayList中对象的排序 (Comparable VS Comparator)

    我们通常使用Collections.sort()方法来对一个简单的数据列表排序.但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了.在使用这两者 ...

  8. Android Studio从2.3升级到3.1注意事项

    原文:https://blog.csdn.net/lithiumyoung/article/details/80111111 Android Studio从2.3升级到3.1注意事项 项目根目录下的b ...

  9. ld: -pie can only be used when targeting iOS 4.2 or later

    ld: -pie can only be used when targeting iOS 4.2 or later clang: error: linker command failed with e ...

  10. JavaWeb中Tomcat与Eclipse的集成—步骤详解

    前面会简单介绍,下翻Tomcat与Eclipse的集成 一.先介绍一下应用程序的结构: 1.到目前为止应用程序物理结构有两种: C/S——Client / server:这种结构的应用,客户端与服务端 ...