C#之out与ref的共性与区别以及用法


undefinedundefined

引入:

首先看一个例子:

复制代码
 1     class Program
 2     {
 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(int a)
12         {
13             a = 20;
14             return a;
15         }
16     }
复制代码

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

然后我们做如下改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;<br>            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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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。

可以使用如下实例练手!

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

 

posted @   随心所于  阅读(375)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示

"Buy Me A Coffee"