您的位置:首页 > 职场人生

黑马程序员学习日记(8)--函数的ref、out参数和可变参数

2013-07-11 21:01 302 查看
----------------------- 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培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐