一、方法参数的类型----值类型和引用类型

当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置。所以,在目标方法中对形参所做的更改不会对调用者的初始变量产生任何影响。

当方法传递的参数是引用类型是,只是将变量的引用复制到目标参数中,实参和形参的引用指向内存中的同一位置。所以,在目标方法中对形参所做的更改会影响调用者的初始变量。

二、一些特殊的方法参数

1、引用参数---ref (使值类型的变量做方法参数时也可以传引用)

一些数据类型(例如类,数组等引用类型)作为方法的参数时默认是传引用的,大多数数据类型(例如结构,整数类型等值类型)在作为方法的参数时是传值的。那么,如何使值类型的数据作为方法参数时传递的也是引用呢?

方法很简单,只需要在形参的数据类型前加上关键字ref,并在调用时相应地实参前也加上关键字ref即可。

例如:  void  Swap( ref String first, ref String second)   {   .......}

String a="dddd",b="dbbb";

Swap(ref a,ref b); 注意:ref参数必须是可以赋值的变量

2、输出参数---out

除了将参数单向传入一个方法(传值),或同时将参数传入和传出一个方法(传引用)之外,还可以将数据从一个方法内部单向传出方法。为此,代码需要使用关键字out来修饰参数类型。

例如:  int x;   //

func(out x);     //out参数必须是可以赋值的变量,在调用func方法前对out参数赋不赋值都可以。

void func(out int x ) {};// 在此方法中,在使用out参数x之前必须对其赋值,即使在调用此方法前已经对out参数x赋值了,在此方法中仍吧x看做未赋值的变量。

ref参数与out参数都是传引用,在方法中对参数所做的修改都会传到调用者。区别在于,out参数不接受调用者传来参数的数据值,而是把该参数当做未赋值的参数。

3、参数数组-----params(可以将相同类型,数量可变的多个参数传给一个方法)

引入:一般,参数的数量都是由目标方法声明所确定。然而,有时我们希望参数的数量是可变的。或许最好的方法是为方法传一个数组。然而,这会使调用代码变得稍微复杂一些,因为需要事先构造一个数组,再将这个数组作为参数来传递。 为了简化代码,c#提供了一个特殊的关键字,它允许在调用一个方法是提供数量可变的参数,而不是由方法事先固定好参数的数量。

示例:

运行结果:

示例说明:上述例子中方法func可接受数量可变的参数,不管这些参数是以逗号分隔的,还是作为一个数组来传递的。为了获得这样的效果,func方法需要:(1)在方法声明的最后一个参数之前,添加一个parmas关键字。(2)将最后一个参数声明为一个数组。

注意事项:

@1、参数数组不一定是方法声明中的唯一参数。单数必须是最后一个参数。由于只有最后一个参数才可能是参数数组,所以方法最多只能有一个参数数组。

@2、调用者可以为参数数组指定0个参数,这会造成包含0个数据项的一个数组。也可以显示地使用一个数组,而不是以逗号分隔的参数列表,最终生成的CIL代码是一样的。

@3、参数数组是类型安全的------类型必须匹配与数组指定的类型。

@4、假如目标方法的实现要求一个最起码的参数数量,请在方法声明中显示指定必须提供的参数。这样一来,假如要求的参数遗失了,就会导致编译器报错,而不需要依赖于运行时错误处理。例如:使用int max (int first,params int[] operands)而不是int max(params int[] operands),确保至少有一个值传给方法max。

4、可选参数:

从c#4.0开始,增添了对可选参数的支持。声明方法是将常量赋给参数,以后调用方法是就不必每一个参数都指定,若不指定该参数则该参数为方法声明时指定的初始值。

例如:

void  func(int x, int y=2) { Console.WrinteLine(x+y);}

func(3,2) 和func(3)的输出结果是相同的。

注意:

@1、可选参数一定放在所有必须的参数(没有默认值的参数)后面。可选参数的数量可以是多个。

@2、默认值必须是一个常量,或者说必须是编译时能确定的一个值。

5、命名参数

命名参数是c#4.0新增的一个方法调用功能。利用命名参数,调用者可显示指定参数名,并为该参数赋一个值而不是像以前那样只能依据参数顺序来决定哪个值赋给哪个参数。

例如: void  func(int x, int y=2) { Console.WrinteLine(x+y);}     func(y:3,x:2);

void  display(string firstname, string middlename=default(string), string lastname =default(string));      display(firstname:"susan",lastname: "lili");

注意:如果一个方法有大量参数,而且其中许多都是可选参数(访问Microsoft COM库时,这是很常见的情况),那么命名参数语法肯定能带来不少便利。但这个便利的代价是牺牲方法接口的灵活性。过去,参数名可以自由更改,不会造成调用代码无法编译。但在添加了命名参数后,参数名就成为方法接口的一部分。更改名称会导致使用命名参数的代码无法编译。

6、方法解析(即当同一个方法调用可以适用多个方法,将调用哪个方法)

当同时使用参数数组,可选参数,命名参数,方法重载等功能时,可能造成同一个方法调用可以适用多个方法。

(1)假如由于一个方法有一个可选参数,造成两个方法都适用(方法重载时可能出现),编译器最终选择的将使无可选参数的方法。

(2)假如有两个适用的方法,每个都需要(对参数)执行一次隐式转换,就选择与更具体的类型匹配的方法。例如,如果调用者传递的是一个int,那么接受double的方法将优先于接受object的方法。这是由于double比object更具体。

(3)如果有多个适用的方法,但无法从中挑选一个最具唯一性的,编译器就会报错,指明调用存在歧义。
---------------------
作者:susan19890313
来源:CSDN
原文:https://blog.csdn.net/susan19890313/article/details/6841541
版权声明:本文为博主原创文章,转载请附上博文链接!

c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)相关推荐

  1. golang 传值 传引用 简介

    目录 1. 基础类型 2. struct 3. 函数 4. slice 5. map 6. chan 7. 总结 1. 基础类型 byte,int,bool,string,float,数组等均是传值. ...

  2. Vue Router不要再使用params传参了,params获取不到参数,官方删除params传参

    问题描述 之前说过,vue路由传参有两种方式,分别是query和params:query是明文,params是隐藏的: 今天在使用params的时候发现获取不到参数了 我的写法: 1. 路由配置: { ...

  3. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)

    目录 一.方法参数的类型----值类型和引用类型 二.一些特殊的方法参数 1.引用参数---ref 2.输出参数---out 注意:ref和out的区别 3.可变参数/参数数组-----params ...

  4. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  5. 几句话弄清楚Java参数传值还是传引用

    最近刷题用递归解决关于树的问题的时候,在递归函数调用的时候什么时候传入值,什么时候传入引用有疑问,因为这关系到什么时候我们需要恢复现场,什么时候不需要.在网上搜索了一下,感觉这篇总结的非常简单明了,简 ...

  6. Java传值与传引用

    基本参数类型:传值 对象类型:传引用 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实 ...

  7. 5个php实例,细致说明传值与传引用的区别

    传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: 传值 ...

  8. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  9. 关于内存的划分和传引用传参数的区别

    1.堆 2.栈 空间较小 3.全局 4.代码段 要搞懂每个区域放什么东西 堆 复杂类型 栈 变量 静  代 复杂类型对象没有指针指的时候,堆中的内容垃圾回收 1 函数传对象的时候,其实是首先在堆里面开 ...

最新文章

  1. OpenStack之虚拟机热迁移
  2. W10中给文件夹添加备注或者注释
  3. 网页性能优化02-懒加载工作原理
  4. boost::iostreams::stream_offset用法的测试程序
  5. java中乐观锁_Java中乐观锁与悲观锁的实现
  6. linux中var的作用,linux中var是什么意思
  7. 基于MaxCompute+PAI的用户增长方案实践
  8. onvif学习笔记3:NTP命令实现的示例
  9. 隐马尔可夫(HMM)模型的各种语言实现
  10. html5结构 客户端缓存,Javascript--离线应用与客户端储存
  11. python小游戏,植物大战僵尸,免费源代码分享,少儿编程体验项目,项目注释详细,可更改游戏参数,关注私聊“关注即送植物大战僵尸源代码”即可免费获得
  12. 李江涛:使用Sakai构建开放式教学平台
  13. 在html语言中读取txt文件中的内容,Javascript写入txt和读取txt文件示例详解
  14. 全国计算机大赛游戏作品,计算机作品大赛优秀作品展示---数字动漫游戏栏目
  15. linux 网桥浅析
  16. ADIDAS的完整形式是什么?
  17. 软件工程:编码和测试
  18. vc模拟 tabletpc_业力和TabletPC笔
  19. 有没有计算机网课,有没有电脑录制视频工具可以录制网课?
  20. python 游戏按键精灵 PyDirectInput介绍

热门文章

  1. 2017年第3届上海国际零售业设计与设备展会刊(参展商名录)
  2. 【总结】一篇关于flask框架开发的知识点汇总手册(纯干货)
  3. Android语音通话实现方案及相关技术介绍
  4. 回顾2019年度京东集团10件大事:不忘初心,坚定前行
  5. 聚合供应链是什么,聚合供应链中台能给商户带来什么样的价值
  6. MySQL之悲观锁场景举例
  7. 各种泵的图形符号_定量泵的图形符号
  8. LoRaWAN介绍10 定位
  9. EtherCAT设备协议详解二、EtherCAT状态机及配置流程
  10. swing入门教程(五) Swing概念