前言

哈哈,今天来给大家讲解一下关于C#中方法及参数的几种类型解析,没有看过的朋友,可以仔细的来瞧瞧了!

那么,还是话不多说,直接给大家献上今天的干货。

一、方法中参数的类型

1.in型参数

int 型参数通过值传递的方式将数值传入方法中,即我们在Java中常见的方法。

2.ref型参数

该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。该类型与out型的区别在于:

1ref 型传递变量前,变量必须初始化,否则编译器会报错,而out型则不需要初始化。

2ref 型传递变量,数值可以传入方法中,而out型无法将数据传入方法中。换言之,ref 型有进有出,out 型只出不进。

3.out 型参数

与 ref 型类似,仅用于传回结果。

4.注意事项

1out型数据在方法中必须要赋值,否则编译器会报错。eg:如下图若将代码中的sum1方法的方法体 改为 a+=b; 则编译器会报错。原因:out 型只出不进,在没给 a 赋值前是不能使用的 改为 b+=b+2; 编译器也会报错。原因:out 型数据在方法中必须要赋值。

2重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错 eg:若将下面的代码中将方法名 vsum1 改为 sum(或者将方法名 sum 改为 sum1),编译器会报错。

Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out

原因:参数类型区别仅限于为 ref 与为 out 时,若重载对编译器而言两者的元数据表示完全相同。

1.  `class C{`2.  `//1. in型参数`3.  `publicvoid sum(int a, int b) {`4.  `a += b;`5.  `}`6.  `//2. ref型参数`7.  `publicvoid sum(refint a, int b) {`8.  `a += b;`9.  `}`10.  `//3. out型参数`11.  `publicvoid sum1(outint a, int b){`12.  `a = b+2;`13.  `}`14.  `publicstaticvoidMain(string[] args) {`15.  `C c = new C();`16.  `int a = 1, b = 2;`17.  `c.sum(a,b);`18.  `Console.WriteLine("a:{0}", a);`19.  `a = 1; b = 2;`20.  `c.sum(ref a, b);`21.  `Console.WriteLine("ref a:{0}", a);`22.  `a = 1; b = 2;`23.  `c.sum1(out a, b);`24.  `Console.WriteLine("out a:{0}", a);`25.  `}`26.  `}`

输出结果:

从代码也可以看出,int 型参数为值传递,所以当将变量 a 传入方法时,变量 a 的值并不会发生变化。而 ref 型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out 型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。

5.ref 和 out 的区别

一个用关键字 ref 表示,一个用 out 标示。

牵扯到数据是引用类型还是值类型。

一般用这两个关键字你是想调用一个函数将某个值类型的数据通过一个函数后进行更改。传 out 定义的参数进去的时候这个参数在函数内部必须初始化。否则是不能进行编译的。ref 和 out 都是传递数据的地址,正因为传递地址,才能对源数据进行修改。

一般情况下不加 ref 或者 out 的时候,传值类型的数据进去实际上传进去的是源数据的一个副本,也就是在内存中新开辟了一块空间,这里面存的值是与源数据相等的,这也就是为什么在传值类型数据的时候你如果不用 return 是无法修改原值的原因。但是你如果用了 ref,或者 out,这一切问题都解决了,因为他们传的是地址。

out 比起 ref 来说,还有一个用法就是可以作为多返回值来用,都知道函数只能有一个返回值,C#里,如果你想让一个函数有多个返回值,那么OUT能很容易解决。

二、对于复杂引用类型参数传递的控制

所谓复杂,是参数是数组或集合类型,或者参数包含这些类型数据,这种情况下上面的方法不能保证参数数据不被修改,因为即使对象为只读的,但是对象中的数组或集合字段(属性)还是可以修改的。

1.集合参数(包含集合字段的引用参数也一样)

.net 4.5以前版本可以使用不包含修改集合元素方法的接口来代替具体集合类型。例如使用IEnumerable接口代替List。4.5版本可以直接使用IReadOnlyCollection接口或实现该接口的集合类型。

2.数组参数

没有好的办法保护数组类型参数不被修改,所以尽量避免使用数组类型作为方法参数,除非用到可选参数时候。

三、扩展方法

扩展方法可以实现在不需要修改目标类,也不需要继承目标类的情况下为其添加一个方法。规则:

1、扩展类必须为静态类,扩展方法必须为静态方法。

2、扩展方法的第1个形参开头必须使用 “this” 关键字然后再填写扩展的目标类。

3、如果需要接收参数则从第2个参数开始算起,第1个参数在真正调用方法时是隐藏的。

1.  `publicstaticclassExtensionString{`2.  `//向 String 类扩展一个统计单词数量的方法`3.  `publicstaticintCountWord(thisString str) {`4.  `return str.Split(' ').Length;`5.  `}`6.  `}`8.  `classMainClass{`9.  `publicstaticvoidMain(string[] args) {`10.  `Console.WriteLine("单词数量:"+ "Hello World".CountWord()); //没有参数`11.  `}`12.  `}`

传值类型_what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅相关推荐

  1. 接收list参数_what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅...

    更多精彩,请点击上方蓝字关注我们! 前言 哈哈,今天来给大家讲解一下关于C#中方法及参数的几种类型解析,没有看过的朋友,可以仔细的来瞧瞧了! 那么,还是话不多说,直接给大家先上今天的干货了. 一.方法 ...

  2. 关于Jquery中ajax方法data参数用法的总结

    关于Jquery中ajax方法data参数用法的总结 jquery手册描述: 示例: $.ajax({type: "POST",url: "some.php", ...

  3. 详解XMLHTTP中setRequestHeader方法和参数

    详解XMLHTTP中setRequestHeader方法和参数 setRequestHeader("Content-type", "application/x-www-f ...

  4. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  5. JavaSE基础知识(九)--Java中的方法重载(涉及基本类型的重载)

    Java SE 是什么,包括哪些内容(九)? 本文内容参考自Java8标准 Java中的基本类型有一个特性:它能自动从一个"较小"的类型转换成"较大"的类型! ...

  6. 计算机系统指定文件类型,一、1.在计算机系统中,依靠_______来指定文件类型。.doc...

    一.1.在计算机系统中,依靠_______来指定文件类型..doc 一.1. 在计算机系统中,依靠 _______ 来指定文件类型. A)文件名 B)扩展名 C)文件内容 D)文件长短 本文档由[中文 ...

  7. java中equals方法的参数_equals方法的参数必须为Object类型的引用变量

    核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...

  8. 你不知道LinkedList中的方法

    linkedList.indexOf(3)    // 返回此列表中首次出现的指定元素的索引 linkedList.lastIndexOf(3)   // 返回此列表中最后出现的指定元素的索引 lin ...

  9. 关于Jquery中ajax方法data参数用法

    data 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 processData 选项说明以禁止此自动转换.必须为 Key/Value 格式.如果为数组,jQ ...

最新文章

  1. 学Java还是Python?一张图告诉你!
  2. 网络推广离不开关键词的精准挖掘
  3. 【AI学院】老司机手把手带学言有三的经典书籍《深度学习之图像识别》,需要的赶紧上车吧...
  4. LeetCode 1114 按序打印
  5. java 生成sql脚本_java导出insert语句并生成sql脚本
  6. mysql 交互命令 导出_MySQL数据导入导出方法与工具(2)
  7. 用html编写你好,02 - HTML5第一个项目:HelloWorld!(收藏)
  8. Spring IOC 之解析Bean:解析 import 标签
  9. uniapp 打包成微信小程序
  10. 明小子3.5检测网站应用
  11. cad重新加载php命令,cad刷新命令是什么?
  12. 桌面上计算机图标怎么改成中文,怎么修改电脑桌面上的图标
  13. linux网页版控制台,linux Web控制台
  14. 学计算机编程应该先学什么,计算机编程好学吗?计算机编程入门应该先学什么?...
  15. 【图像处理】轮廓二阶矩计算目标中心-计算目标中心位置方法3
  16. px转vw和rem配置-vue-行内样式px转vw和rem-----项目中无需出现rem单位;
  17. sqlite3错误原因
  18. windows系统各进程详解
  19. 实现微信向多好友定时发送信息
  20. 神经网络学习----如何利用训练好的神经网络模型进行预测

热门文章

  1. 17. Letter Combinations of a Phone Number
  2. java 集合类源码分析--collections
  3. DB2的日志理解难点
  4. bigtall的敏捷日记(1)
  5. MySQL 唯一索引和普通索引该如何选择?
  6. Proteus模拟STM32F103R6微控制器之串口通信USART的方法
  7. 机器人也是“艺术家”!上海世界移动大会聚焦5G时代
  8. Labview通过RS422通讯接口PC与下位机通信
  9. 华为2016年应届毕业生招聘公告
  10. usb类调用失败解释