本文介绍了C#7.0中out参数的新特性。当一个方法返回多个值时,C# out参数就会被使用。当一个参数在方法中用Out关键字/参数传递时,那么该方法就以方法调用中传递的相同的变量值工作。如果变量值发生变化,方法的参数值也会发生变化。
C#的Out参数有一些额外的特点
- Out参数可以在没有声明和初始化的情况下传递。
- Out参数可以在方法参数列表中使用var类型。
- 在函数定义和调用中,Out参数的名称不一定要相同。
本文通过实例阐述了Out参数的改进特性。所以,让我们逐一来看看。
Out参数的线内声明
在早期的C#版本中,我们需要将Out变量的声明和初始化分成两个不同的语句。C# 7.0提供了这样的功能,即Out参数可以不通过其声明和初始化。让我们看一个例子。
- using System;
- using static System.Console;
- 命名空间OutExample
- {
- 类程序
- {
- static void Main(string[] args)
- {
- WriteLine("Please enter radious for circle");
- double radious = Convert.ToDouble(ReadLine());
- double circumference = CalculateCircle(radious, out double area);
- WriteLine($"圆的周长是{circumference}")。
- WriteLine($"Circle's Area is {area}")。
- ReadKey()。
- }
- static double CalculateCircle(double radious, out double area)
- {
- 面积 = Math.PI * Math.Pow(radious, 2);
- double circumference = 2 * Math.PI * radious;
- 返回圆周率。
- }
- }
- }
现在,运行这个程序。结果显示如下图所示。
图1:输出
这段代码显示了关于Out参数的以下特点。
-
一个方法可以有一个或多个Out参数。
-
当使用一个有Out参数的方法时,你不需要事先声明和初始化该Out参数。
- double circumference = CalculateCircle(radious, out double area)。
Out参数可以在方法调用时在线声明,如面积参数。
-
内联声明的Out参数可以在同一个块中被访问。它的范围是在它所调用的方法中。
-
在方法返回之前,被调用的方法需要给Out参数赋值。
-
该方法可以基于Out参数被重载。
-
异步方法没有Out参数。
-
迭代器方法没有out参数。
隐式类型的Out参数
如例子所示,为了清晰起见,Out参数的声明在参数列表中指定了类型。然而,该语言确实支持使用隐式类型的局部变量。var变量的数据类型将在为该变量赋值时确定。在给变量赋值后,该变量有一个确定的数据类型,不能被替换。
由于var类型的变量有本地范围(指方法主体中的范围),同样,内联Out参数在方法主体中也有范围,这就是为什么var类型也可以作为Out参数使用。
让我们来创造一个例子。找出最长的子数组的长度,该子数组包含的数字可以从一个整数数组中连续排列。
- using static System.Console;
- 命名空间OutExample
- {
- 程序类
- {
- static void Main(string[] args)
- {
- int [] arr = { 1, 56, 58, 57, 90, 92, 94, 93, 91, 45 };
- int n = arr.Length;
- findLength(arr, n, out var maxlenth);
- WriteLine($"最长的连续子数的长度是{maxlenth}")。
- ReadKey();
- }
- static void findLength(int []arr, int n, out int maxlength)
- {
- maxlength = 1。
- for (int i = 0; i < n - 1; i++)
- {
- int mn = arr[i], mx = arr[i];
- for (int j = i + 1; j < n; j++)
- {
- mn = min(mn, arr[j]);
- mx = max(mx, arr[j])。
- 如果((mx - mn) == j - i)
- {
- maxlength = max(maxlength, mx - mn + 1);
- }
- }
- }
- }
- static int min(int x, int y)
- {
- return (x < y) ? x : y;
- }
- static int max(int x, int y)
- {
- 返回 (x > y) ? x : y。
- }
- }
- }
现在,运行这个程序。结果显示如下图所示。
图2:输出
如上面的程序所示,out参数可以是一个隐含的类型。
在Try模式中的使用
Out参数主要用于Try模式中。在这种模式中,一个方法返回一个表示成功或失败的bool,如果方法成功,则返回一个Out变量,提供结果。让我们看一个同样的例子。这个例子显示,用户输入数值。如果该值是有效的整数,那么它将显示结果。
- using static System.Console;
- 命名空间OutExample
- {
- 程序类
- {
- static void Main(string[] args)
- {
- WriteLine("请输入你的年龄")。
- bool isValid = int.TryParse(ReadLine(), out int age);
- 字符串 message = isValid ?$"你是{年龄}.岁" : "请输入有效年龄"。
- WriteLine(message);
- ReadKey()。
- }
- }
- }
如上面的代码所示,如果成功的话,try pattern方法会给Out参数赋值。现在,运行这个程序,结果显示如下图所示。
图3:输出
总结
在C#7.0中,Out参数的功能得到了改进。在这个新版本中,线内和隐式类型声明都是新的。