转载:http://www.cnblogs.com/kissdodog/archive/2013/05/11/3072815.html

一、按值传递参数

  值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递。

  方法被调用时,CLR做如下操作:

  1、在托管堆栈中为形参分配空间;

  2、将实参的值复制到形参。

  这个太常用了,按值传递参数,是复制一份,因此不影响原来参数的值。

public class Program{static void Main(string[] args){int i = 1;int j = 2;int k = Plus(i,j);Console.WriteLine(i);   //输出 1Console.WriteLine(j);   //输出 2Console.WriteLine(k);   //输出 5Console.ReadKey();}public static int Plus(int i, int j){i = i + 1;j = j + 1;return i + j;}}

二、按引用传递参数 -- 关键字ref

  和前面的“按值传递”相对应的是按引用传递。顾名思义,这里传递的不在是值,而是引用。注意这里不是传递一个复制品了,而是将真实的自己传到方法中供方法玩弄。

  注意点:

  1、按引用传递的参数,系统不再为形参在托管栈中分配新的内存。

  2、此时,形参名其实已经成为实参名的一个别名,它们成对地指向相同的内存位置。

    public class Program{static void Main(string[] args){int i = 1;int j = 2;int k = Plus(ref i,ref j);      //实参前也要加ref关键字Console.WriteLine(i);   //输出 2Console.WriteLine(j);   //输出 3Console.WriteLine(k);   //输出 5Console.ReadKey();}public static int Plus(ref int i, ref int j)    //形参钱要加ref关键字{i = i + 1;j = j + 1;return i + j;}}

  以上例子与上面的几乎一样,只是加了4个ref,留意到,在方法中对参数的修改,会对传方法的参数的值造成影响。

三、输出参数 - 关键字out

  输出参数和引用参数有一定程度的类似,输出参数可用于将值从方法内传递到方法外,实际上就相当于有多个返回值。要使用输出参数只需要将引用参数的ref关键字替换为out关键字即可。但又一点必须注意,只有变量才有资格作为输出参数,文本值和表达式都不可以,这点要谨记。

  注意两个问题:

  1、编译器允许在方法中的任意位置、任意时刻读取引用参数的值。

  2、编译器禁止在为输出参数赋值前读取它。

  这意味着输出参数的初始值基本上是没意义的,因为它在使用前要被赋予新的值。因此想通过输出参数将值传入方法的路是行不通的。

    public class Program{static void Main(string[] args){int i = 1;int j = 2;int k = Plus(i,out j);      //实参前也要加out关键字Console.WriteLine(i);   //输出 1Console.WriteLine(j);   //输出 100Console.WriteLine(k);   //输出 102Console.ReadKey();}public static int Plus(int i, out int j){i = i + 1;j = 100;return i + j;}}

四、参数数组 - 关键字params

  参数数组:

public class Program{static void Main(string[] args){int count1 = Plus(1);       //输出 1Console.WriteLine(count1);int count2 = Plus(1, 2, 3);//输出 6Console.WriteLine(count2);int count3 = Plus();    //输出 0  参数数组本身可选,没传入值也不会出错{Console.WriteLine(count3);}Console.ReadKey();}public static int Plus(params int[] values){int count = 0;foreach (int i in values){count = count + i;}return count;}}

  另外再补充两个C# 4.0的新特性可选参数与命名参数:

  1、可选参数

  可选参数,顾名思义,它不是必需的。对于一般的参数,如果不为它指定值,可能会导出运行出错。但是可选参数不会。

  可选参数的规则:

  1、可选参数不能为参数列表第一个参数,它必须位于所有必选参数之后;

  2、可选参数必须指定一个默认值;

  3、可选参数的默认值必须是一个常量表达式;

  4、所有可选参数以后的参数都必须是可选参数。

public class Program{static void Main(string[] args){int count1 = Plus(5);    //当不指定可选参数时,是默认值Console.WriteLine(count1);  //输出 15int count2 = Plus(5,5); //当指定可选参数时,有默认值Console.WriteLine(count2);  //输出 10Console.ReadKey();}public static int Plus(int i, int j = 10){return i + j;}}

  2、命名参数

  可选参数解决的是参数默认值的问题,而命名参数解决的是参数顺序的问题,命名参数将我们从记忆每个方法数目繁多的参数列表中解放了出来。让你可以不按顺序输入参数。

public class Program{static void Main(string[] args){//string str = "字符串";//int i = 10;//Console.WriteLine(Plus(str:str,i:i));     //虽然很怪异,但这3行代码是能正常运行的Console.WriteLine(Plus(str:"字符串",i:10));      //注意顺序与方法签名参数中的不一样Console.ReadKey();}public static string Plus(int i, string str){return str + i.ToString();}}

转载于:https://www.cnblogs.com/wangsir1992/p/7063101.html

C#方法的参数 Ref Out Params 4种类型的参数相关推荐

  1. 存储过程中的in out in out 三种类型的参数

    in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变. out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程 in out 表示高参数可以 ...

  2. 电阻参数_详解几种常用电阻参数的表示方法

    电阻是非常常见的电子元器件,前面我们介绍过常见的电阻分类,几种常见特殊电阻及电阻的检测方法,今天让我们一起来学一学电阻参数的几种常用的表示方法. 电阻的参数主要有直标法.文字符号法.色标法和数码表示法 ...

  3. java中三种转string的方法_java中int,char,string三种类型的相互转换

    如何将字串 String 转换成整数 int? int i = Integer.valueOf(my_str).intValue(); int i=Integer.parseInt(str); 如何将 ...

  4. java方法传对象参数_Java方法中的参数太多,第2部分:参数对象

    java方法传对象参数 在上一篇文章中 ,我研究了与方法和构造函数的长参数列表相关的一些问题. 在那篇文章中,我讨论了用自定义类型替换基元和内置类型以提高可读性和类型安全性. 这种方法使方法或构造函数 ...

  5. Java方法中的参数太多,第2部分:参数对象

    在上一篇文章中 ,我研究了与方法和构造函数的长参数列表相关的一些问题. 在那篇文章中,我讨论了用自定义类型替换基元和内置类型以提高可读性和类型安全性. 这种方法使方法或构造函数的众多参数更具可读性,但 ...

  6. ajax传递多参数类型,Ajax传递不同类型的参数

    1.目录结构: 1.传递普通的参数 2.传递对象 3.传递List 4.传递数组 1.1 前端页面 前端页面.png 1.2 HTML代码 注意:需要引入layui噢 button{ margin-t ...

  7. Vue3: vue3 props接多个不同类型的参数,默认false

    哪天的问题来着...嘶...(挠头)... 之所以会卡在这里,是因为在我的经验及认知里,封装组件中props的使用,接参时从来都是一个参数对应一个值,尤其是在ts中,还更为严格地设定了参数类型,所以我 ...

  8. C#参考之方法参数关键字:params、ref及out

    params 使用 params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 如果未发送任何参数,则 pa ...

  9. C#中方法的参数四种类型(值参数、ref、out、params)详解

    看公司程序偶然看到ref引用,于是查找一了番,现整理如下: 1. 值参数 (不加任何修饰符,是默认的类型)       2. 引用型参数 (以ref 修饰符声明)       3. 输出参数 (以ou ...

最新文章

  1. netcore读取json文件_.net core读取json格式的配置文件
  2. CentOS6.3.x86_64安装Trac
  3. 20155308郝文菲--第三次作业
  4. Lucene实战(第2版)》
  5. iwrite提交不了作业_在云端,我们把花样作业pick起来!
  6. 利用docker中的nginx镜像部署angular项目
  7. design短语的用法总结_design的意思、用法、搭配和例句
  8. [转]深入浅出Java设计模式之备忘录模式
  9. php查询字段前30个字符,php/json我的字段名被截断为30个字符。我能停下来吗?
  10. ubuntu下装java
  11. AT1 one-dimensional objects
  12. docker本地构建kerberos单机环境
  13. ubuntu安装python库_ubuntu下的python请求库的安装
  14. 理解分布式和区块链技术
  15. winform listbox增加鼠标双击事件
  16. 传统音乐制作与计算机音乐制作,论电脑音乐制作与传统音乐制作的方式对比
  17. photoshop(ps)基础入门知识 认识图层
  18. java quartz 每月1号执行_Quartz 每月1号 执行规则表达式
  19. vc编程的ime输入法菜单开发
  20. NoteExpress基础使用

热门文章

  1. 【原】文本挖掘——特征选择
  2. 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
  3. Entity Framework 4.3尝试体会
  4. Microsoft Office Communications Server 2007部署以及客户端安装(详细)【一】
  5. 非IE浏览器下让界面变灰色
  6. python打开一个软件并进行操作_在Python中运行程序(R)以执行操作(执行脚本)的问题...
  7. Springboot整合Nacos配置中心
  8. 电脑 win10 android,新版win10 20185来袭!微软:让你可以直接从PC访问手机App
  9. 神舟笔记本触摸板驱动_关闭笔记本触摸板的四种方法
  10. html页面选择附件实现,实现单文件上传,页面局部刷新_html/css_WEB-ITnose