c#ref和out的相同点_C#之out与ref的共性与区别以及用法

引入:

首先看一个例子:

1 classProgram2 {3 static void Main(string[] args)4 {5 int number = 10;6 int result =Test(number);7 Console.WriteLine("number={0},result={1}", number, result);8 Console.ReadKey();9 }10

11 static int Test(inta)12 {13 a = 20;14 returna;15 }16 }

此时,显然得到number=10,a=20;把number传给方法Test中的a,在方法number中改变a的值,number的值并不会发生改变。

然后我们做如下改变

class Program

{

static void Main(string[] args)

{

int number;

int result = Test(number);//此处会报错“使用了未赋值的局部变量‘number’”

Console.WriteLine("number={0},result={1}", number, result);

Console.ReadKey();

}

static int Test(int a)

{

a = 20;

return a;

}

}

显然变量没有赋值就使用是错误的

现在我们使用out代码如下:

class Program

{

static void Main(string[] args)

{

int number;

int result = Test(out number);//注意调用时也需要加out

Console.WriteLine("number={0},result={1}", number, result);

Console.ReadKey();

}

static int Test(out int a)

{

a = 20;//若方法中参数标有out,一定对a先进行赋值才可以使用。

return a;

}

}

此时结果为number=20,result=20;一旦使用out,a就不是往方法里传值而是往外返回值。

不再是把number的值赋给a了,而是把number与a建立起一种联系,在方法Test中必须对a进行赋值,对a进行赋值后就相当于对number进行赋值(即把number的引用传递给a)

out总结:

1.在方法的参数前加out,那么在传参数的时候也必须在参数前使用out,以表明此参数并不是用来传入而是用来传出值的。

2.如果参数是以out形式传入的,那么在传入不能对其进行赋值。

3.在方法中对于用out修饰的参数,必须对其赋值,且必须在其使用前进行赋值。

ref:

class Program

{

static void Main(string[] args)

{

int number = 10;

int result = Test(ref number);//注意调用时也需要加ref

Console.WriteLine("number={0},result={1}", number, result);

Console.ReadKey();

}

static int Test(ref int a)

{

int b = a;

a=20;

return b;

}

}

此时结果为:number=20,result=10;此时把number的值传入了方法Test,并且变量b使用了,然后对a进行赋值20,并且传了出去。

即ref既可以传入参数也可以传出参数。

总结ref与out

out用于传入值,ref是双向的既可以传入又可以传出。(其原理为引用类型传递与值类型传递,不使用out与ref时为值类型传递,使用时为引用类型传递)

在传参数的过程中如果有ref与out修饰,那么改变方法中参数变量的值,也会改变使用者方法中变量的值。

out的使用实例

1.微软提供了一个int类型的方法

int.TryParse(string s,out int result)

首先解释一下这个方法

该方法的返回值为bool型。即转换成功返回true,转换失败返回false;同时转换成功会返回一个result,result的值即为转换后的值,转换失败result则为null

下面我们自己写一个方法实现这个功能

class Program

{

static void Main(string[] args)

{

string s = "123";

int result;

if (ConvertInt(s, out result))

{

Console.WriteLine("转换成功" + result);

}

else

{

Console.WriteLine("转换失败!");

}

Console.ReadKey();

}

static bool ConvertInt(string s,out int result)

{

try

{

result = Convert.ToInt32(s);

return true;

}

catch {

result = 0;//注意此处,必须对out修饰的参数result赋值

return false;

}

}

}

可在需要返回多个值时使用out与ref。

可以使用如下实例练手!

对一个数组元素求和并返回和与数组元素的最大值和最小值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值