(十五)C#编程基础复习——值传递、引用传递、输出传递
特此声明:本教程内容可能有部分参照其他博主的观点或描述,但始终不影响我学习的热情,代码全部自己手工敲打,编辑此教程目的不是为了博取大家眼球,也不是为利益所驱,只是纯属为了方便自己学习,编辑的过程中也让自己加深了对C#各个基础的印象,同时也让自己编码过程更加流畅顺利,最后还能帮助到有需要的人,代码都是自己亲测有效,如有侵权可以联系本人删除。
通过前面的学习,我们了解了在调用带有参数的函数时,需要将参数传递给函数。在介绍这几种传递方式之前,我们先来介绍一下形式参数(形参)和实际参数(实参)这两个概念:
- 形式参数:在定义函数阶段参数列表中定义的参数称之为形式参数,简称形参,可以将它看做变量的名称,它没有具体的值,只是用来接收函数调用时传递过来的数据;
- 实际参数:在函数被调用时传递给函数的参数称之为实际参数,简称实参,可以将它看做变量的值,用来为形参赋值。
- 参数可以通过以下三种方式传递给函数:
一、值传递
在C#中,值传递是将参数传递给函数的默认方式,值传递的本质就是将实参的副本(将实参的值复制一份)传递给函数的形参。当调用函数时,将使用实参为每个形参赋值,并为每个形参创建一个新的存储位置,由于形参和实参指向不同的内存位置,所以无论是修改实参的值还是修改形参的值都不会对彼此造成影响。
代码示例如下:
namespace Day5
{
internal class Program
{
static void Main(string[] args)
{
int val = 10;
Program obj = new Program();
Console.WriteLine("调用函数之前:{0}",val);
obj.Func(val);
Console.WriteLine("调用函数之后:{0}",val);
Console.ReadLine();
Console.ReadKey();
}
public void Func(int val)
{
val *= val;//val=val*val;
Console.WriteLine("函数内部的值:{0}",val);
}
}
}
运行结果:
通过结果可以看出,尽管我们在函数内部对形参val的值进行的修改,但是并不会影响函数外部实参val的值。
二、引用传递
引用传递是对变量内存位置的引用。与值传递不同,使用引用传递的形式传递参数时,并不会为形参创建新的内存地址,而是与实参共同指向相同的内存地址。整因为如此,当修改形参的值时,实参的值也会被修改。
namespace Day5
{
internal class Program
{
static void Main(string[] args)
{
int val = 10;
Program obj = new Program();
Console.WriteLine("调用函数之前:{0}",val);
obj.Func(ref val);
Console.WriteLine("调用函数之后:{0}",val);
Console.ReadLine();
Console.ReadKey();
}
public void Func(ref int val)//关键字ref
{
val *= val;//val=val*val;
Console.WriteLine("函数内部的值:{0}",val);
}
}
}
运行结果:
三、输出传递
使用return语句可以从函数中返回一个值,但是使用输出传递则可以从函数中一次性返回多个值。输出传递与引用传递相似,不同之处在于输出传递是将数据从函数中传输出来而不是传输到函数中。
示例代码如下:
namespace Day5
{
internal class Program
{
static void Main(string[] args)
{
int val = 33;
Program obj = new Program();
Console.WriteLine("调用函数之前val的值为:{0}",val);
obj.getValue(out val);
Console.WriteLine("调用函数之后val的值为:{0}",val);
Console.ReadLine();
Console.ReadKey();
}
public void getValue(out int x)//关键字out
{
int temp = 11;
x = temp;
x *= x;
}
}
}
运行结果:
在使用输出传递时,也可以不为实参赋值,例如下
namespace Day5
{
internal class Program
{
static void Main(string[] args)
{
int a,b;
Program obj = new Program();
obj.getValue(out a,out b);
Console.WriteLine("调用函数之后a的值为:{0}",a);
Console.WriteLine("调用函数之后b的值为:{0}",b);
Console.ReadLine();
Console.ReadKey();
}
public void getValue(out int x,out int y)//关键字out
{
Console.WriteLine("请输入第一个值:");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个值");
y = Convert.ToInt32(Console.ReadLine());
}
}
}
运行结果:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤