编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅

gowuye 2024-05-16 14:23 3 浏览 0 评论

前言

哈哈,今天来给大家讲解一下关于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.  `}`

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: