C# ref_out_params方法的参数_4种类型的参数
之前学习C#没有做笔记的习惯,因此有些基础上的东西并没有很好地整理起来,虽然这些东西比较常用,因此也没什么影响,但总觉得不整理一下感觉老是有种陌生感。今天特别整理一下C#4种类型的参数。
一、按值传递参数
值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递。
方法被调用时,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); //输出 1
Console.WriteLine(j); //输出 2
Console.WriteLine(k); //输出 5 Console.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); //输出 2
Console.WriteLine(j); //输出 3
Console.WriteLine(k); //输出 5 Console.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); //输出 1
Console.WriteLine(j); //输出 100
Console.WriteLine(k); //输出 102 Console.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); //输出 1
Console.WriteLine(count1); int count2 = Plus(1, 2, 3);//输出 6
Console.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); //输出 15 int count2 = Plus(5,5); //当指定可选参数时,有默认值
Console.WriteLine(count2); //输出 10 Console.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();
}
}

C# ref_out_params方法的参数_4种类型的参数的更多相关文章
- Mysqldump参数大全 这 些参数 不同于 mysql 的那些参数(下边文章开头有链接) :2 种类型的参数含义是不一样的
Mysqldump参数大全 这 些参数 不同于 mysql 的那些参数 :2 种类型的参数含义是不一样的 Mysqldump参数大全(参数来源于mysql5.5.19源码) 参数 参数说明 --a ...
- mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的
mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数 :2种类型的参数 含义是不一样的 一,mysql命令行参数 Usage: mysql [OPTIONS] [ ...
- C#基础知识之Ref Out Params 4种类型的参数
一.按值传递参数 值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递. 方法被调用时,CLR做如下操作: 1.在托管栈中为形参分配空间: 2.将实参的值复制到形参. 这 ...
- JNI_Z_07_方法的操作(没有String类型的参数)_参数的传递方式
1. 2.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_TjniMethod02.h" JNIEXPORT void ...
- JNI_Z_06_方法的操作(没有String类型的参数)_父类的同名方法
1.关键在于: 使用的 method id 是 子类的 还是 父类的,而 父类methodID的获取 必须使用 父类的class对象. 2.VC6(CPP)的DLL代码: #include<st ...
- JNI_Z_05_方法的操作(没有String类型的参数)
1.步骤: (1).获取 jclass (2).获取 method的id (3).调用 method ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法 ...
- 调用的方法里接收一个List<>类型的参数,里面是自定义的EC类, 我要通过反射构建这List对象
public static object CreateGeneric(Type generic, Type innerType, params object[] args) ...
- 存储过程中的in out in out 三种类型的参数
in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变. out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程 in out 表示高参数可以 ...
- 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)
详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类 Python中函数参数定义及调用函数时传参 ...
随机推荐
- The square chest
The square chest Sophia pressed the button in front of her, slamming her fist against it. The door r ...
- jquery-ui datepicker使用
这是一款老外设计的日期控件 很多显示方式都是国外的 需要自己调整一下 closeText: "Done", prevText: "上一月", nextText: ...
- 【转】兼容性测试套件(CTS)框架用户手册
原文网址:http://blog.sina.com.cn/s/blog_416166e90102v6bi.html 兼容性测试套件(CTS)框架用户手册 1.为什么需要兼容性测试(以下称CTS)? 2 ...
- MySQL存储过程事务处理
BEGIN ; ; START TRANSACTION; #这边放sql语句,涉及到的表必须都为InnoDB THEN ROLLBACK; ELSE COMMIT; END IF; END 转自:ht ...
- hihoCoder 1116 计算 (线段树)
题意 : 描述 现在有一个有n个元素的数组a1, a2, ..., an. 记f(i, j) = ai * ai+1 * ... * aj. 初始时,a1 = a2 = ... = an = 0,每次 ...
- Linux 通过HTTP进行域名更新
一.3322动态域名更新接口 接口地址 API URL http://members.3322.net/dyndns/update HTTP请求 GET /dyndns/update?hostname ...
- 基础总结篇之二:Activity的四种launchMode
合抱之木,生於毫末:九層之台,起於累土:千里之行,始於足下.<老子> 今天在社区看到有朋友问“如何在半年内成为顶级架构师”,有网友道“关灯睡觉,不用半年的...”,的确,做梦还来的快一些. ...
- 【Spark Core】任务运行机制和Task源代码浅析1
引言 上一小节<TaskScheduler源代码与任务提交原理浅析2>介绍了Driver側将Stage进行划分.依据Executor闲置情况分发任务,终于通过DriverActor向exe ...
- Android 打造自己的个性化应用(二):应用程序内置资源实现换肤功能
通过应用程序内置资源实现换肤,典型的应用为QQ空间中换肤的实现. 应用场景为: 应用一般不大,且页面较少,风格相对简单,一般只用实现部分资源或者只用实现背景的更换. 此种换肤方式实现的思路: 1. 把 ...
- Linux 挂载命令 --mount
1.挂载光盘命令 mount : mount [-t vfstype] [-o options] device dir mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点 -t ...