前言
记得大一刚开始学后端语言的时候,在基础阶段学的"传参"知识点让我一脸懵,现在凭着感觉简单写写,最近给自己定了任务:每周至少写3篇blog,反正也没什么人看,就随便叨叨几句
分类
在csharp中有3种传参,分别是值传参,引用传参,输出传参。
值传参
其中值传参是csharp默认的传参方式,这种方式在调用一个方法的时候,会为每一个参数都开辟一个新的内存地址(存储空间)。
而参数呢,又分为实参和形参,在值传参时,如果参数是实参,那么是实参的值就会COPY给形参,所以说实参和形参引用的不是统一给内存地址。由此可得,形参的值更新的时候,不会影响实参的值,从而保证了实参的数据安全。
举个例子:
有怎么一个需求:给你a,b两个整数,让你将a,b两个整数的值互换,你会怎么做。
static void Main(string[] args)
{
int a = 200;
int b = 400;
int c;//定义一个暂存变量
c = a;
a = b;
b = c;
Console.WriteLine($"a={a},b={b}");
Console.ReadKey();
}
上面的代码,将会打印出a=400,b=200
已经成功交换。下面我封装一下看看:
static void Main(string[] args)
{
int a = 200;
int b = 400;
Swap(a, b);
Console.WriteLine($"a={a},b={b}");//a=200,b=400
Console.ReadKey();
}
public static void Swap(int number1,int number2)
{
int c;
c = number1;
number1 = number2;
number2 = c;
}
上面的代码运行后,打印出来的结果是a=200,b=400
,为什么没有交换呢,是因为在main方法中调用Swap(a,b)
时,Swap会为a和b这组数据开辟两个新的内存地址,number1和number2,这两个内存地址和变量a、变量b毫无瓜葛的,所以就算再Swap中做了交换,也不会影响a和b的值。像这种直接把数据传递进入方法的形式(操作)就叫值传参。
引用传参
上面的这个例子中,我头铁!就是想调用Swap方法,交换a和b的值,还有别的办法吗,能不能控制将a,b两个实参传入Swap时,不让方法去开辟新的内存地址,直接用a和b变量本身的内存地址?嘿嘿,csharp确确实实有一种方式可以做到,这就是引用传参,大白话就是调用方法的时候,传给方法的参数直接告诉方法:" 我丫的给你内存地址了,直接用就行,不用你重新开辟新的内存地址了!"(可能我怎么描述很俗气,但是自娱自乐的我很爽,你管不着)
代码:
static void Main(string[] args)
{
int a = 200;
int b = 400;
Swap(ref a, ref b);
Console.WriteLine($"a={a},b={b}");//a=400,b=200
Console.ReadKey();
}
public static void Swap(ref int number1, ref int number2)
{
int c;
c = number1;
number1 = number2;
number2 = c;
}
上面的代码中我只在Swap方法和调用Swap方法时的参数前添加了ref
关键字,再运行一下a和b的变量就能正常交换了。其中ref
是reference,引用的意思。这时候调用Swap方法时,传入的参数就可以不让Swap方法去开辟新的内存地址,直接用a和b变量本身的内存地址了。
输出传参
最后一个输出传参呢,和其他语言不通(其他语言没有)。我们知道,在方法中,retuen语句可以返回一个特定的数据,但是我们还可以用输出参数,在不修改方法返回类型的情况下(注意:不修改方法的返回类型的情况下),输出更多的数据。比如下面是一个没有返回值的方法
static void Main(string[] args)
{
int c = 300;
GetValue(c);
Console.WriteLine(a);
Console.ReadKey();
}
public static void GetValue(int number)
{
number = 100;
}
在mian方法中调用一下GetValue,按照上面值传参的解读,整个程序执行完后,变量a的值是不会更新的,但是,如果我们定义GetValue方法的时候在参数前面加上out
,那么这个这个时候更新number参数,变量c的值也会随之更新,进而向方法外部扩展。
static void Main(string[] args)
{
int c = 300;
GetValue(out c);
Console.WriteLine(c);
Console.ReadKey();
}
public static void GetValue( out int number)
{
number = 100;
}
定义GetValue方法的时候在参数前面加上out
后,程序执行完后变量a的值被更新为100。这就是所谓的输出传参,就是可以把方法内的变化反应在参数中,并且以return以外的形式输出。
值传参和输出传参简单地比较
上面的例子中,不管是值传参还是输出传参,其目的都是希望将输入方法的变量地址传给方法,不让方法为传入的参数开辟新的内存地址。不过,这个输出传参和引用传参看起来好像作用一样的啊,都是改变了参数的数据。那么他们到底有什么不同点呢?先看下代码:
static void Main(string[] args)
{
//int a = 200;
int a;//用传参的前提是,被引用的变量必须已经完成了初始化
int b = 400;
Swap(ref a, ref b);
Console.WriteLine($"a={a},b={b}");//a=400,b=200
//int c = 300;
int c;
GetValue(out a);
Console.WriteLine(a);
Console.ReadKey();
}
public static void GetValue( out int number)
{
number = 100;
}
public static void Swap(ref int number1, ref int number2)
{
int c;
c = number1;
number1 = number2;
number2 = c;
}
代码中在min方法里把变量a的初始值给去掉了,然后编译会报错,而将变量c的初始值给去掉后再使用输出参数的getValue方法没有任何问题。
所以引用传参的前提是被引用的变量必须已经完成了初始化。
结语
如有问题,可在下方评论或邮件联系我,联系邮箱:[email protected]
标签:传参,Console,int,void,搞混,static,Swap,玩意 From: https://www.cnblogs.com/ynysj/p/16988440.html