c# 7.0介绍了ref返回和ref local的介绍。如果你对它们是什么以及它们服务的目的感到好奇,那么这篇文章就是为你准备的。
c# 7.0引入了ref return和ref local。这些新特性的主要目标是使开发人员更容易地将引用传递给值类型而不是其值的副本。在处理以值类型实现的大型数据结构时,这一点非常重要。这篇博文展示了如何在c#中使用ref return和ref local。
当前Ref和Out参数。
我们可以使用ref和out参数将一些变量发送到方法,并让它修改该方法的值。这样我们就可以编写“返回”多个值的方法。Ref允许引用的值类型。Out表示变量将在给定参数的方法中得到一个值。
static int DoSomething(ref int i, out int i)
{
// method code
}
c# 7.0引入了对ref返回和本地的支持。这样,我们就可以在方法调用之间移动值类型引用,而不是值的副本。
Ref返回
这里是一个示例方法,它从一个数组返回第一个负数,或者在没有找到负数时给出一个返回值。为了避免值的拷贝,它使用ref返回。
static ref int FindFirstNegativeNumber(int[] numbers, ref int notFoundValue)
{
for (var i=0; i<numbers.Length; i++)
{
if(numbers[i] < 0)
{
return ref numbers[i];
}
} return ref notFoundValue;
}
我们不需要使用编号数组的ref关键字,因为它是一个对象,而且它会以引用的方式引用这个方法。notFoundValue需要ref关键字,因为它是一个值类型,没有ref关键字,我们没有在允许的范围内引用的内存地址。
如果我们尝试这样做:
static ref int FindFirstNegativeNumber(int[] numbers, int notFoundValue)
{
for (var i=0; i<numbers.Length; i++)
{
if(numbers[i] < 0)
{
return ref numbers[i];
}
} return ref notFoundValue;
}
要有引用,我们需要ref或out关键字。否则,它是在给定方法的范围内生存的值的副本。
参考本地
返回值的引用的方法是特殊的,因为它们的返回值是如何存储的。我们不能将ref返回值赋给常规变量。我们必须定义一个变量作为ref,如下例所示:
static void Main(string[] args)
{
var numbers = new[] { 1, 2, -4, 6, -8 };
var returnValue = 0; ref var result = ref FindFirstNegativeNumber(numbers, ref returnValue);
result++; Console.WriteLine("Result: " + result);
Console.WriteLine("\r\nPress any key to continue ...");
Console.ReadKey();
}
变量的声明必须使用ref关键字。我们不能让ref关键字退出,否则它将是一个位置的赋值,而这是编译器不允许的。
结束
Ref返回和本地语言似乎是语言的一个小的补充,但是实际上,它们帮助编写更多的性能代码,因为不需要在方法之间移动值的副本。ref返回值作用域有一些限制,但是,在大多数情况下,我们不会面对无法摆脱这些限制的情况。