C#基础知识之Ref Out Params 4种类型的参数
一、按值传递参数
值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递。
方法被调用时,CLR做如下操作:
1、在托管栈中为形参分配空间;
2、将实参的值复制到形参。
这个太常用了,按值传递参数,是复制一份,因此不影响原来参数的值。
public class Program
{
static void Main(string[] args)
{
int i = ;
int j = ;
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 + ;
j = j + ;
return i + j;
}
}
二、按引用传递参数 -- 关键字ref
和前面的“按值传递”相对应的是按引用传递。顾名思义,这里传递的不在是值,而是引用。注意这里不是传递一个复制品了,而是将真实的自己传到方法中供方法玩弄。
注意点:
1、按引用传递的参数,系统不再为形参在托管栈中分配新的内存。
2、此时,形参名其实已经成为实参名的一个别名,它们成对地指向相同的内存位置。
public class Program
{
static void Main(string[] args)
{
int i = ;
int j = ;
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 + ;
j = j + ;
return i + j;
}
}
以上例子与上面的几乎一样,只是加了4个ref,留意到,在方法中对参数的修改,会对传方法的参数的值造成影响。
三、输出参数 - 关键字out
输出参数和引用参数有一定程度的类似,输出参数可用于将值从方法内传递到方法外,实际上就相当于有多个返回值。要使用输出参数只需要将引用参数的ref关键字替换为out关键字即可。但又一点必须注意,只有变量才有资格作为输出参数,文本值和表达式都不可以。
注意两个问题:
1、编译器允许在方法中的任意位置、任意时刻读取引用参数的值。
2、编译器禁止在为输出参数赋值前读取它。
这意味着输出参数的初始值基本上是没意义的,因为它在使用前要被赋予新的值。因此想通过输出参数将值传入方法的路是行不通的。
public class Program
{
static void Main(string[] args)
{
int i = ;
int j = ;
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 + ;
j = ;
return i + j;
}
}
四、参数数组 - 关键字params
public class Program
{
static void Main(string[] args)
{
int count1 = Plus(); //输出 1
Console.WriteLine(count1);
int count2 = Plus(, , );//输出 6
Console.WriteLine(count2);
int count3 = Plus(); //输出 0 参数数组本身可选,没传入值也不会出错
{
Console.WriteLine(count3);
}
Console.ReadKey();
}
public static int Plus(params int[] values)
{
int count = ;
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(); //当不指定可选参数时,是默认值
Console.WriteLine(count1); //输出 15
int count2 = Plus(,); //当指定可选参数时,有默认值
Console.WriteLine(count2); //输出 10
Console.ReadKey();
}
public static int Plus(int i, int j = )
{
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:)); //注意顺序与方法签名参数中的不一样
Console.ReadKey();
} public static string Plus(int i, string str)
{
return str + i.ToString();
}
}
C#基础知识之Ref Out Params 4种类型的参数的更多相关文章
- 基础知识《二》java的基本类型
一.java基本数据类型 Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型 ...
- 【基础知识】C#数据库中主键类型的选择
主键在数据库中占有很大的地位,对于表的关联性,和数据的唯一识别性有重要的作用: 1,在C#开发中,Int自增字段和Guid(数据库中是uniqueidentifier类型)可设置为主键: 1>G ...
- Dapper基础知识四之 利用Dapper获取不同类型的主键值
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 一下是Dapper源码几种主键,当主键不包含"ID" ...
- HTML+CSS+JS基础知识
HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
- C# 中out,ref,params参数的使用
C#中有三个高级参数,分别是out,ref,params: 1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. ...
- Jquery真的不难~第一回 编程基础知识
Jquery真的不难~第一回 编程基础知识 回到目录 前言 说Jquery之前,先来学习一下Javascript(以后简称为JS)语言中的基础知识问题,其时对于每种编程语言来说基础知识都是大同小异 ...
- Go基础知识梳理(二)
Go基础知识梳理(二) 简单函数的定义 //有参数有返回值 func sum(a int, b int) int { return a + b } //无返回值 func sum(a int, b i ...
- C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...
随机推荐
- [论文笔记] Fine-Grained Head Pose Estimation Without Keypoints
Fine-Grained Head Pose Estimation Without Keypoints 简介 head pose estimation 经典论文,使用CNN预测三个角度值,pitch, ...
- Linux高级调试与优化——信号量机制与应用程序崩溃
背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...
- 【C++进阶】 to_string,stringstream
to_string函数主要进行以下一些参数转换为string stringstream,位于<sstream>库中 https://blog.csdn.net/jllongbell/art ...
- Selenium学习之==>WebDriverApi接口详解
浏览器操作 driver.back() # 后退 driver.forward() # 前进 driver.refresh() # 刷新 窗口操作 driver.get_window_size() # ...
- golang 导出CSV文件中文乱码的问题
golang 导出CSV文件中文乱码的问题 解决办法: 在csv文件的开头写入 UTF-8 BOM // 创建文件 dstf, err := os.Create("./data/" ...
- oracle-控制文件的备份和恢复
本篇将介绍各种备份及恢复控制文件的方法,在介绍恢复时,以备份和重做日志(包括归档日志和在线日志)没有丢失为前提. 无备份情况下的控制文件恢复参考13.3,丢失重做日志的情况请参考12篇“不完全数据库恢 ...
- Sql 把Xml字符串转换成一张表
分享一个Sql技巧,把xml字符串转换成一个表格 DECLARE @IdHandel INT EXEC sp_xml_preparedocument @IdHandel OUTPUT, @Bar_Ip ...
- 基于html5二个div 连线
因为要实现拖拽连线研究了一下基于extjs 和html5的不同实现方法 extjs底层的画图引擎是svg 不知道在html5大潮即将袭来的前夕一贯走在技术前沿的extjs开发团队没有自己封装基于htm ...
- python pandas 自动生成批量测试数据插入数据库 mysql
1.python连接数据库游标 # coding:utf-8 from sqlalchemy import create_engine class connet_databases: def __in ...
- 网络通讯数据.传输json(java<==>C#)
ZC:主要是测试解决 时间转成JSON不一样的问题 ZC:java中转换时间格式的关键是“JSONUtils.getMorpherRegistry().registerMorpher(new Date ...