现在的位置: 首页 > 综合 > 正文

C#之可变参数,ref,out

2013年08月16日 ⁄ 综合 ⁄ 共 2266字 ⁄ 字号 评论关闭

1、可变参数

在C#4.0中增加了许多新的特性,这里我主要说一下——可变参数数组:int sum(params int[] values) ;int sum(string name,params int[] values)

注意:可变参数数组必须是最后一个,而且可变参数是C4.0中才有的特性。

参数默认值(C#4.0) :void SayHello(string name,int age=20)(*了解)       注意:参数默认值的设置也必须是在非默认值参数的后面。
static void Main(string[] args)
{
int[] values = { 3, 5, 2, 9, 7 };
Max(true, "", values);
int i = Max(values);

int j = Max(true, "Hello", 3, 5, 2, 97, 7);
int i = Max(3,3,5);
Console.WriteLine(j);

string[] values1 = Console.ReadLine();

Console.WriteLine("{0},{1}", 3, 5, 6, 9, 3, 3, 90, 9);
SayHello("邹玉杰");
SayHello(“YuJie", 24);
Console.ReadKey();
}

//个数不确定的可变参数以数组的形式传递
static int Max(bool b, string msg, params int[] values)
{
Console.WriteLine(msg);
int max = 0;
foreach (int value in values)
{
if (value > max)
{
max = value;
}
}
return max;
}

static void SayHello(string name,int age)
{
Console.WriteLine("我是{0},我{1}岁",name,age);
}

static void SayHello(string name)
{
SayHello(name, 20); //用重载来实现参数默认值的效果,在构造函数中用的特别多
}

函数参数默认是值传递的,也就是“复制一份”,例子:
int age=20;
IncAge(age);

Console.WriteLine("age={0}",age);

2、ref and out

ref必须先初始化,因为是引用,所以必须先“有”,才能引用,如果不先初始化,调用的时候就取不到值会报错,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用,但是在方法内部一定要记得为其赋值,不然返回个空的东西,有什么用?根本就没有意义了。

ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。

static void Main(string[] args)
{
int i1 = 1;
DotIt(i1);
Console.WriteLine(i1);
int i1 = 10;
int i2 = 20;

//Swap(i1, i2);
Console.WriteLine("i1={0},i2={1}", i1, i2);  //返回的结果依旧是10,20,因为Swap(i1, i2)方法处理的是变量i1,i2的拷贝或者说是副本,变量i1,i2原先的值并没有因此而改变。

//用ref之前必须给变量赋值
Swap(ref i1, ref i2);//传递引用。给ref传递参数的时候也要加上ref
Console.WriteLine("i1={0},i2={1}", i1, i2);

bool b= false;//不需要为out赋值
int i = Parse(Console.ReadLine(), out b);
if (b)
{
Console.WriteLine("成功,i={0}", i);
}
else
{
Console.WriteLine("错误");
}
Console.ReadKey();
}

//int i传进来的的时候是复制了一份传进来,折腾的是复制品
static void DotIt(int i)
{
Console.WriteLine(i);
i++;
Console.WriteLine(i);
}

static void Swap(ref int i1, ref int i2)//reference→ref
{
//标记为ref就是要求调用者传递变量的引用
int temp = i1;
i1 = i2;
i2 = temp;
}

static void Swap(int i1, int i2)
{
int temp = i1;
i1 = i2;
i2 = temp;
}

static int Parse(string s,out bool success)
{
//Console.WriteLine(success); //这样会报错,因为success没有为其赋值
if(s=="一")
{
success = true;
return 1;
}
else if(s=="二")
{
success = true;
return 2;
}
else
{
success = false;
return -1;
}
}

关于异常处理,除非万不得已,不然尽量不要使用try catch 语句,切记!(案例:两个变量的交换;int.TryParse。)
string s = Console.ReadLine();
int i;
if (int.TryParse(s, out i))
{
Console.WriteLine("成功:" + i);
}
else
{
Console.WriteLine("输入错误");
}
//int i = Convert.ToInt32(s);
//i++;
//Console.WriteLine(i);
Console.ReadKey();

抱歉!评论已关闭.