C#图解教程-方法参数笔记(上)

      一晃大学四年要过去了,期间乱点了很多技能点, 导致每一项技能都只是处于入门阶段。为了将C#作为我的主要技能,准备恶补相关姿势(知识),通过各种技术论坛的推荐,找到了《C#图解教程》这本书。初一看,感觉只不过都只是把知识罗列了出来而已,而且很多都是已知的,但是看到后面,发现它把很多以前模糊不清的知识变得清晰了,而且还学到了以前都没有学到的新知识。特别结合图片的解释,让初学者更加容易理解。

不多说,这次想将本书第五章方法有关参数相关知识进行梳理。

1、参数知识点

参数类型有值参数、引用参数、输出参数、参数数组这么四种。上面的都是位置参数,另外C#还提供了命名参数和可选参数(和python极其类似)。

2、值参数

使用值参数,通过将实参的值复制到形参的方式把数据传递给方法。方法调用的时候,做了如下的操作:

1、在栈中为形参分配空间

2、讲实参的值复制给形参

我们来举一个例子,看代码:

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

 一句话说:如果方法内部对参数做了赋值操作(引用类型内部成员赋值),跳出方法后,值类型参数还是不变,引用类型参数值会发生改变。

3、引用参数

使用引用参数,需要这两点

1、必须在方法的声明和调用中都使用def修饰符;

2、实参必须是变量,在用作实参之前必须被赋值。如果是引用类型变量,可以赋值一个引用或null。

 对于值参数而言,系统会在栈上为形参分配内存。而引用参数会具有以下这两个特点

1、不会为形参在栈上分配内存空间;

2、形参的参数名将作为实参的别名,指向相同的内存位置。

我们来举一个例子,看代码:

结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

 

一句话说:如果方法内部对参数做了赋值操作,跳出方法后,值类型参数和引用类型参数值都会发生改变

3、引用类型作为值参数和引用参数

之前看到两个例子,引用类型作为值参数和引用参数结果都会发生改变。但是要注意一点的是,他们改变的都是引用类型内部成员的值。

现在我们来看看,如果对引用类型本身赋值一个新对象会发生什么。我想通过上面两幅图应该也很容易知道了。

下面代码展示引用类型作为值参数传递:

 结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

下面代码展示引用类型作为引用参数传递(只加了ref):

 结果如下:

好了,我们用图解的形式来解释下,它是如何在堆栈中执行的:

总结:本质来说值参数实际就将实参在栈上复制了一份给形参,方法内部对形参做操作,执行方法后,会在栈上自动销毁,而实参不受影响。而引用参数则是相当于实参的别名,方法内部对实参做操作,执行方法后,实参受影响。

人生就是不放弃的坚持到底。
原文地址:https://www.cnblogs.com/hackerffg/p/6268415.html