c#中out和ref的使用区别

本文详细介绍了C#中ref和out关键字的区别与用法。ref传递的是参数的地址,使用前必须对变量赋值;out作为返回值,使用前无需赋值,但在函数结束前必须赋值。此外,还提供了具体的代码示例帮助理解。

ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。使用ref前必须对变量赋值,out不用。
out
的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。 

 

如果你想返回多个值怎么办,OUT....

区别可以参看下面的代码:

using  system;
class  testapp
{
 
static   void  outtest( out   int  x,  out   int  y)
 {
// 离开这个函数前,必须对x和y赋值,否则会报错。 
  
// y = x; 
  
// 上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行 
  x  =   1 ;
  y 
=   2 ;
 }
 
static   void  reftest( ref   int  x,  ref   int  y)
 { 
  x 
=   1 ;
  y 
=  x;
 }
 
public   static   void  main()
 {
  
// out test
   int  a,b;
  
// out使用前,变量可以不赋值
  outtest( out  a,  out  b);
  console.writeline(
" a={0};b={1} " ,a,b);
  
int  c = 11 ,d = 22 ;
  outtest(
out  c,  out  d);
  console.writeline(
" c={0};d={1} " ,c,d);

  
// ref test
   int  m,n;
  
// reftest(ref m, ref n); 
  
// 上面这行会出错,ref使用前,变量必须赋值

  
int  o = 11 ,p = 22 ;
  reftest(
ref  o,  ref  p);
  console.writeline(
" o={0};p={1} " ,o,p);
 }

refout都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结起来,他们有如下语法区别:

1ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//
语法错误
SomeMethod( out i );//
通过
2
ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
   int j=i;//
通过
   //...
}
public void SomeMethod(out int i)
{
   int j=i;//
语法错误
}
3
ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。

总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要赋一个值。也就是说函数承担初始化这个变量的责任。 

  

C# 中,`out` `ref` 参数修饰符都用于按引用传递参数,允许方法修改调用方变量的值。然而,它们在使用场景、语义限制方面存在关键区别。 ### 参数初始化要求 - 对于 `ref` 参数,调用方法前必须对变量进行初始化,因为 `ref` 参数既用于输入也用于输出。这意味着变量在传递给方法之前必须具有明确的值。 - `out` 参数则不要求变量在调用方法前已经初始化。相反,方法内部必须为 `out` 参数赋值,否则会导致编译错误。`out` 参数主要用于方法需要返回多个值的情况[^2]。 ### 参数用途 - `ref` 参数可以双向传递数据,即方法可以读取传入的值,并且可以修改该值,然后将修改后的值返回给调用者。 - `out` 参数仅用于从方法返回数据,而不传递初始值。因此,`out` 参数通常用于获取方法的输出结果,类似于额外的返回值[^3]。 ### 方法定义调用的要求 - 在方法定义调用时,无论是 `ref` 还是 `out` 参数,都必须显式地使用相应的关键字。这意味着方法签名中声明的参数类型与调用时传递的参数类型必须匹配,包括是否带有 `ref` 或 `out` 修饰符[^2]。 - 不同于普通参数,引用参数(无论是 `ref` 还是 `out`)要求传递的实参必须是一个变量,不能是常量或属性[^4]。 ### 代码示例 以下是一个展示 `ref` `out` 使用方式的例子: ```csharp public class Program { public static void Main() { int a = 10; int b; // 使用 ref 参数 ModifyValue(ref a); Console.WriteLine($"After ModifyValue: a = {a}"); // 输出: After ModifyValue: a = 20 // 使用 out 参数 GetValue(out b); Console.WriteLine($"After GetValue: b = {b}"); // 输出: After GetValue: b = 30 } public static void ModifyValue(ref int value) { value *= 2; // 修改传入的值 } public static void GetValue(out int value) { value = 30; // 必须在此处初始化 } } ``` ### 总结 虽然 `ref` `out` 都允许方法修改调用方变量的值,但它们的设计目的不同。`ref` 更适合于需要同时传递输入输出值的场景,而 `out` 则更适合于仅需从方法返回值的情况。选择合适的关键字有助于提高代码的清晰度可维护性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值