黑马程序员学习日记(8)--函数的ref、out参数和可变参数
2013-07-11 21:01
302 查看
----------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
普通的值类型变量,在别处的改动实际上是复制的副本在函数的参数前边加ref,使用参数时,将参数前边也加ref,则在调用函数的时候直接引用的是变量本身,它是引用而非复制。ref必须得初始化(函数内部对外部的值进行改变)
out在给out方式传递参数之前,必须在函数内部必须得给参数赋值。外部不需要给参数初始化的值,到out函数内部认为是外部没有初始化,必须在内部给参数赋值。(内部为外部赋值,用于函数有多个返回值的场景)。每个函数只有一个返回值,如果想有多个就要用到out
----------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
函数的ref、out参数:
Rom'Zmo�Vp=Vnt-family:"Times New Roman"'>在给out方式传递参数之前,必须在函数内部必须得给参数赋值。外部不需要给参数初始化的值,到out函数内部认为是外部没有初始化,必须在内部给参数赋值。(内部为外部赋值,用于函数有多个返回值的场景)。每个函数只有一个返回值,如果想有多个就要用到out普通的值类型变量,在别处的改动实际上是复制的副本在函数的参数前边加ref,使用参数时,将参数前边也加ref,则在调用函数的时候直接引用的是变量本身,它是引用而非复制。ref必须得初始化(函数内部对外部的值进行改变)
out在给out方式传递参数之前,必须在函数内部必须得给参数赋值。外部不需要给参数初始化的值,到out函数内部认为是外部没有初始化,必须在内部给参数赋值。(内部为外部赋值,用于函数有多个返回值的场景)。每个函数只有一个返回值,如果想有多个就要用到out
class Program { static void Main(string[] args) { int i = 1; IncNum(i); Console.WriteLine("i的值是{0}",i); int j = 1; IncAge(ref j); Console.WriteLine("j的值被函数改变了(ref的作用){0}",j); int k = 0; GetValue(out k); Console.WriteLine("k的值被out掉了,初始化不起作用,他将有一个新的值{0},这是在函数内部被重新的初始化了",k); //---------------------------------------out应用-------------------------------------------- int m; string str = Console.ReadLine(); if (int.TryParse(str, out m))//有两个返回值,一个是true或者false,另一个是转换成功后m的整型的值 { Console.WriteLine("转换成功,{0}", m); } else { Console.WriteLine("数据错误"); } //---------------------------------------ref应用-------------------------------------------- int n1 = 20, n2 = 30; //Swap(n1, n2);这样操作的是n1、n2的复制的参数,并没有操作他们本身 Swap(ref n1, ref n2); Console.WriteLine("n1的值是{0},n2的值是{1}",n1,n2); Console.ReadKey(); } static void IncNum(int num) { num++;//num只是i的复制的值,不能改变i本身 } static void IncAge(ref int age)//ref的参数是对传递过来的参数的引用而不是复制,所以它将直接改变传递过来的值得本身而非它的复制品 { age++; } static void GetValue(out int num) { // num++;外部初始化的值对out参数内部不起作用,必须在含有out参数函数的内部重新初始化 num = 10; } //---------------------------------------ref应用-------------------------------------------- //static void Swap(int m, int n)这样只是操作参数复制的数并没有操作参数本身 static void Swap(ref int m,ref int n) { int temp; temp = m; m = n; n = temp; } }
可变参数
给函数添加可变参数,只需在传进的参数数组前边加param,可变参数可以与不变参数一块用(需要注意的是可变参数必须得是所有参数中的最后一个)。参数默认值(. net4.0,用函数重载来实现):void sayHello(string name,int age=20)static void Main(string[] args) { string[] strs = {"bac","bcd","cddd","fefe"}; VFun(strs);//如果传入的参数是数组则读取到的效果跟普通参数一样 VFun("abc", "bcd", "def");//实现了添加可变参数,相加多少就加多少 SayHello("小明", 11, "狗蛋", "键盘", "老鼠屎", "鼠标");//可变参数与不变参数的混合使用 Console.ReadKey(); } static void VFun(params string[] values)//传入可变参数,可以有多个参数,类型要一致,只需在参数数组前边加上param即可 { foreach (var item in values) { Console.WriteLine(item); } } static void SayHello(string name,int age,params string[] nickname)//可变参数可以与普通参数一块使用,但是一定要放到最后边 { Console.WriteLine("我的名字叫{0},我今年{1}岁了",name,age); foreach (var item in nickname) { Console.WriteLine("我的外号叫{0}",item);//如果把item错写成了nickname则只会输出第一个nickname } }
----------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_java学习日记_Java高新技术静态导入,可变参数和加强的FOR循环
- 黑马程序员:OC学习日记之方法和函数
- Python学习笔记7-把函数当参数传递、指定可变参数
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)(反射参数是一个数组的函数要小心)
- 黑马程序员——C#学习日记之字符串处理函数
- 函数的ref 和out 参数
- 黑马程序员_学习笔记:11) Jdk5.0新特性:增强for循环、可变参数(...)、静态导入、枚举:关键字 enum、自动拆装箱、泛型
- 黑马程序员_学习日记48_616数据库开发及ADO.Net(带参数的Sql语句、数据库与文本文件导入导出、省市联动、资料管理器、DataSet (ado.net断开式数据访问)、SQLHelper)
- C#函数参数传送之out与ref的应用
- Python学习笔记7-把函数当参数传递、指定可变参数
- C#.NET学习笔记---C#中方法参数的传递方式: 值类型(默认),ref类型,out类型和params类型
- 黑马程序员--学习笔记(集合框架中的两个工具类,高级for循环,可变参数,静态导入)
- 黑马程序员_日记68_可变参数
- C语言不定参数个数,可变参数函数使用学习
- C++学习之可变参数的函数与模板
- ref与out参数的使用--学习笔记
- Python学习笔记7-把函数当参数传递、指定可变参数
- Delphi学习之函数参数修饰中的var 、out和const
- C#值类型与引用类型、 out 、 ref、 params 参数、函数重载、数组为函数参数或返回值
- python学习笔记——函数可变参数处理