out参数 在C#中

370 阅读3分钟

本文介绍了C#7.0中out参数的新特性。当一个方法返回多个值时,C# out参数就会被使用。当一个参数在方法中用Out关键字/参数传递时,那么该方法就以方法调用中传递的相同的变量值工作。如果变量值发生变化,方法的参数值也会发生变化。

C#的Out参数有一些额外的特点

  1. Out参数可以在没有声明和初始化的情况下传递。
  2. Out参数可以在方法参数列表中使用var类型。
  3. 在函数定义和调用中,Out参数的名称不一定要相同。

本文通过实例阐述了Out参数的改进特性。所以,让我们逐一来看看。

Out参数的线内声明

在早期的C#版本中,我们需要将Out变量的声明和初始化分成两个不同的语句。C# 7.0提供了这样的功能,即Out参数可以不通过其声明和初始化。让我们看一个例子。

  1. using System;
  2. using static System.Console;
  3. 命名空间OutExample
  4. {
  5. 类程序
  6. {
  7. static void Main(string[] args)
  8. {
  9. WriteLine("Please enter radious for circle");
  10. double radious = Convert.ToDouble(ReadLine());
  11. double circumference = CalculateCircle(radious, out double area);
  12. WriteLine($"圆的周长是{circumference}")。
  13. WriteLine($"Circle's Area is {area}")。
  14. ReadKey()。
  15. }
  16. static double CalculateCircle(double radious, out double area)
  17. {
  18. 面积 = Math.PI * Math.Pow(radious, 2);
  19. double circumference = 2 * Math.PI * radious;
  20. 返回圆周率。
  21. }
  22. }
  23. }

现在,运行这个程序。结果显示如下图所示。

图1:输出

这段代码显示了关于Out参数的以下特点。

  1. 一个方法可以有一个或多个Out参数。

  2. 当使用一个有Out参数的方法时,你不需要事先声明和初始化该Out参数。

    1. double circumference = CalculateCircle(radious, out double area)。

    Out参数可以在方法调用时在线声明,如面积参数。

  3. 内联声明的Out参数可以在同一个块中被访问。它的范围是在它所调用的方法中。

  4. 在方法返回之前,被调用的方法需要给Out参数赋值。

  5. 该方法可以基于Out参数被重载。

  6. 异步方法没有Out参数。

  7. 迭代器方法没有out参数。

隐式类型的Out参数

如例子所示,为了清晰起见,Out参数的声明在参数列表中指定了类型。然而,该语言确实支持使用隐式类型的局部变量。var变量的数据类型将在为该变量赋值时确定。在给变量赋值后,该变量有一个确定的数据类型,不能被替换。

由于var类型的变量有本地范围(指方法主体中的范围),同样,内联Out参数在方法主体中也有范围,这就是为什么var类型也可以作为Out参数使用。

让我们来创造一个例子。找出最长的子数组的长度,该子数组包含的数字可以从一个整数数组中连续排列。

  1. using static System.Console;
  2. 命名空间OutExample
  3. {
  4. 程序类
  5. {
  6. static void Main(string[] args)
  7. {
  8. int [] arr = { 1, 56, 58, 57, 90, 92, 94, 93, 91, 45 };
  9. int n = arr.Length;
  10. findLength(arr, n, out var maxlenth);
  11. WriteLine($"最长的连续子数的长度是{maxlenth}")。
  12. ReadKey();
  13. }
  14. static void findLength(int []arr, int n, out int maxlength)
  15. {
  16. maxlength = 1。
  17. for (int i = 0; i < n - 1; i++)
  18. {
  19. int mn = arr[i], mx = arr[i];
  20. for (int j = i + 1; j < n; j++)
  21. {
  22. mn = min(mn, arr[j]);
  23. mx = max(mx, arr[j])。
  24. 如果((mx - mn) == j - i)
  25. {
  26. maxlength = max(maxlength, mx - mn + 1);
  27. }
  28. }
  29. }
  30. }
  31. static int min(int x, int y)
  32. {
  33. return (x < y) ? x : y;
  34. }
  35. static int max(int x, int y)
  36. {
  37. 返回 (x > y) ? x : y。
  38. }
  39. }
  40. }

现在,运行这个程序。结果显示如下图所示。

图2:输出

如上面的程序所示,out参数可以是一个隐含的类型。

在Try模式中的使用

Out参数主要用于Try模式中。在这种模式中,一个方法返回一个表示成功或失败的bool,如果方法成功,则返回一个Out变量,提供结果。让我们看一个同样的例子。这个例子显示,用户输入数值。如果该值是有效的整数,那么它将显示结果。

  1. using static System.Console;
  2. 命名空间OutExample
  3. {
  4. 程序类
  5. {
  6. static void Main(string[] args)
  7. {
  8. WriteLine("请输入你的年龄")。
  9. bool isValid = int.TryParse(ReadLine(), out int age);
  10. 字符串 message = isValid ?$"你是{年龄}.岁" : "请输入有效年龄"。
  11. WriteLine(message);
  12. ReadKey()。
  13. }
  14. }
  15. }

如上面的代码所示,如果成功的话,try pattern方法会给Out参数赋值。现在,运行这个程序,结果显示如下图所示。

图3:输出

总结

在C#7.0中,Out参数的功能得到了改进。在这个新版本中,线内和隐式类型声明都是新的。