【C#】 之 out和ref
2015-12-29 12:24
369 查看
默认传参:
参数传入函数的默认行为是按值传递。传入方法中的参数是原始数据的副本。以下是一个小例子:
public static int Add( int x, int y) { int ans=x+y; x=100000; y=800000; return ans; } static void Main(string[] args) { int x = 9, y = 10; Console.WriteLine("在调用之前:x={0},y={1}", x, y); Console.WriteLine("在调用之后:x={0},y={1},ans={2}", x, y, Add(x, y)); Console.ReadLine (); }其中我们在调用的参数中将x和y重新赋值,但它改变的只是原始数据的一个副本,所以原始数据不会产生影响。最后的结果如下
Out传参:
Out传参其实就是把参数传出去,从方法中传出去。static void Add( out int x, int y,out int ans) { x = 100000; y = 800000; ans = x + y; } static void Main(string[] args) { int x=9; int y=10; int ans=0; Console.WriteLine("在调用之前:x={0},y={1},ans={2}", x, y,ans); Add( out x, y,out ans); Console.WriteLine("在调用之后:x={0},y={1},ans={2}", x,y,ans); Console.ReadLine(); }
正从最后的结果可以看出只有y之没有改变,虽然y值在方法中被重新赋值了,但是它并没有传出来,所以还是原值。
Ref传参:
Ref传参是引用传参,引用参数必须在他们被传递给方法之前初始化,因为方法在退出之前必须为输出参数赋值。static void Add(ref int x, int y, out int ans) { x = 100000; y = 800000; ans = x + y; } static void Main(string[] args) { int x = 9; int y = 10; int ans = 0; Console.WriteLine("在调用之前:x={0},y={1},ans={2}", x, y, ans); Add(ref x, y, out ans); Console.WriteLine("在调用之后:x={0},y={1},ans={2}", x, y, ans); Console.ReadLine(); }
通过输出可以看到x的值已经被修改了。
总结:
通过上面的三个小例子可以看出,默认传参只是把我们的一个值的副本传递给函数方法,而函数在自己里面对值干了什么,原值是无所谓的,我们要这个方法最后return的那个结果就好了。而out传参其实就是把函数中的参数给传出来,默认传参不是只能返回个值嘛,out就牛多了,想把哪个传回来就把哪个传回来。
至于ref传参,那就是个引用,对原值的引用,方法把原值改成什么样子就是什么样子,改了就是改了。这里有时候和out从结果上看差不多,但是不太一样,out返回来取代原来的,ref是直接就改了。
以上就是我的理解了。。
——本学习总结参考书籍为《精通C#》作者:Andrew Troelsen
相关文章推荐
- C# RDLC 绑定
- C# Regex 正则表达式 匹配特定的内容
- C# RGB颜色转换为16进制
- C# 用 * 输出两个等腰三角形组成的菱形
- C# 使用 DirectoryInfo 递归指定目录中的所有目录及文件
- C# 打开指定的文件夹 记住路径中 / 与 \ 的用法
- 带有按钮并且可以执行单击事件的WINFORM窗体,体悟C#的创建过程
- C# 入门之 Hello World
- C#动态编译
- 【机房收费系统C#版】——导出Excel
- c#读取xml配置文件
- C#序列化和反序列化代码总结
- C#中xml序列化和反序列化
- c#中SOAP序列化和反序列化
- C#中委托
- C# 发送邮件 qq与163
- C#通用之文件
- C#调用Exe
- 【C#】标签页
- C#难点逐个击破(1):ref参数传递