按值返回 vs. 按引用返回:函数的返回值
介绍
在本指南中,您将了解使用 C# 编程语言通过值和通过引用从函数返回值之间的区别。
读完本指南后,您将了解:
值类型和引用类型之间的根本区别
如何使用按值返回的函数
如何使用按引用返回的函数
按值和按引用
我们将从一些背景概念开始,因为了解这些概念对于本指南的范围来说很重要。
函数是一种编程概念,它允许您打包代码以便随时重复使用。函数旨在执行一项任务,并且可以随时调用来执行该任务。在创建函数时,您可以选择将值传递到其定义中,称为参数。然后,在调用函数时,如果它调用参数,您必须提供要传递给它的参数。参数是您传递给函数以帮助执行函数任务的值。
您可以在下图中看到一个利用函数、参数和参数概念的示例。
将值传递到函数中时,您可以通过值或引用进行传递。当您将值类型参数通过值传递给函数时,这意味着您在函数内部对该参数所做的更改只会在该函数内部受到影响。这不会影响存储在参数值中的原始数据。本质上,当您通过值传递时,您正在将变量的副本发送到函数中。复制的变量可以在函数内部更改;但是,原始数据的值将保持不变。值类型的几个示例是枚举和结构。
另一方面,当您通过引用将值类型参数传递给函数时,您在函数内部对该参数所做的更改将更改原始数据。当您通过引用传递时,您将变量的内存位置传递给函数,并且您在函数内部所做的任何更改都将影响内存中的该位置,因此在函数完成后仍会保留。引用类型的两个示例是数组和委托。
按价值深度
那么,按值传递的函数是什么样的呢?我们将使用与上一节中类似的方法,使用执行乘法的函数。在下面的示例中,我们声明了一个名为x的整数,并为其分配了值 5。然后,我们将x作为参数传递给multiplyNumbersByVal函数。在multiplyNumbersByVal函数中,它接受一个名为y的参数,并将y乘以自身。控制台中写入了三个语句,它们显示了x在通过multiplyNumbersByVal函数之前、内部和之后的状态。
namespace Practice
{
class Program
{
public static void multiplyNumbersByVal(int y)
{
y *= y;
Console.WriteLine("Value of our variable inside multiplyNumbersByVal function: " + y);
}
public static void Main(string[] args)
{
int x = 5;
Console.WriteLine("Value of our variable before multiplyNumbersByVal function: " + x);
multiplyNumbersByVal(x);
Console.WriteLine("Value of our variable after multiplyNumbersByVal function: " + x);
}
}
}
当我们执行此代码时,我们得到以下结果。观察变量的值在函数内部如何变化,但在函数外部保持不变。我们刚刚通过值将变量传递给函数。
参考深度
如果您希望在函数内部更改变量的值,我们将在此处通过引用传递变量。目前有两种通过引用传递值的方法:使用ref关键字和out关键字。
我们首先来看一下 ref,使用与值类型部分相同的概念。查看下面的示例,我们再次声明了一个名为x 的整数,并为其分配了值 5。然后我们将x作为参数传递给multiplyNumbersByRef函数。在multiplyNumbersByRef函数中,它接受一个名为y的参数并将y乘以自身。控制台中写入了三个语句,它们显示了x在执行multiplyNumbersByRef函数之前、执行期间和执行之后的状态。
namespace Practice
{
class Program
{
public static void multiplyNumbersByRef(ref int y)
{
y *= y;
Console.WriteLine("Value of our variable inside multiplyNumbersByRef function: " + y);
}
public static void Main(string[] args)
{
int x = 5;
Console.WriteLine("Value of our variable before multiplyNumbersByRef function: " + x);
multiplyNumbersByRef(ref x);
Console.WriteLine("Value of our variable after multiplyNumbersByRef function: " + x);
}
}
}
当我们执行此代码时,我们得到以下结果。观察变量的值在函数内部如何变化,然后在函数之后保持不变。我们刚刚通过使用 ref 关键字将变量通过引用传递给函数。
out 关键字通过引用传递值的方式与 ref 关键字相同。两者的区别在于,使用 out 不需要在将变量作为参数传递给函数之前对其进行初始化;相反,它需要在被调用函数内部进行初始化。
因此,语法略有不同。
在下面的代码块中,我们将看到一个变量被创建但未初始化,然后使用 out 关键字通过引用传递给函数。还请注意,由于我们在创建变量时没有初始化变量,因此在将其发送到函数之前我们无法打印出该值,因此这里只有两行写入控制台,而不是三行。
namespace Practice
{
class Program
{
public static void multiplyNumbersByRef2(out int y)
{
y = 5;
y *= y;
Console.WriteLine("Value of our variable inside multiplyNumbersByRef2 function: " + y);
}
public static void Main(string[] args)
{
int x;
multiplyNumbersByRef2(out x);
Console.WriteLine("Value of our variable after multiplyNumbersByRef2 function: " + x);
}
}
}
如您所见,尽管语法略有不同,但结果是相同的。
结论
本指南介绍了按值和按引用传递值类型变量的含义,并解释了两者之间的区别。我们还介绍了这两种类型的示例,并查看了生成的输出。- 了解和理解值类型和引用类型之间的区别是一个非常重要的概念。在编写代码时,了解编写函数时将返回什么值非常重要,尤其是当您的客户使用您的软件时。
如果您正在面试一份新工作,了解这个概念也是很重要的,因为潜在的雇主可能会问您这个话题。
可能需要了解的面试问题:
- 值类型和引用类型有什么区别?
- 哪两个关键字与通过引用传递值相关?
- 给出一些值类型和引用类型的例子。
我希望您喜欢阅读本指南,并且它将帮助您理解计算机科学领域最重要的概念之一!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~