参数传递方式有哪些( 二 )



引用类型没有固定的大小 。 例如 , 字符串的大小可以在2字节到接近系统中所有的可用内存之间变化 。 引用类型大小的不确定性意味着 , 它们包含的数据更适合存储在堆上 , 而不是堆栈上 , 但是 , 引用类型的地址(即数据在堆上的位置)有固定的大小 , 所以可以存储在堆栈上 。 把引用存储在堆栈上 , 整个程序的运行速度会快得多 , 因为进程可以快速定位与变量中的数据 。

固定大小的变量和大小动态变化的变量分别存储在堆栈和堆上 , 会使对这两种变量的操作方式产生差异 。 下面通过比较System.Drawing.Point结构(一种值类型)和System.Text. StringBuilder类(一种引用类型)来说明这一点 。

Point结构是.NET图形库的一部分 , 而该图形库是System.Drawing命名空间的一部分 。 StringBuilder类是System.Text命名空间的一部分 , 用于高效地编辑字符串 。 命名空间将在第8章论述 。

下面先看看如何使用System.Drawing.Point结构:

Dim ptX As New System.Drawing.Point(10, 20)

Dim ptY As New System.Drawing.Point

ptY = ptX

ptX.X = 200

Console.WriteLine(ptY.ToString())

这个运算的输出是{X=10, Y=20} , 这看起来是符合逻辑的 。 代码在将ptX复制到ptY后 , 包含在ptX中的数据就复制到堆栈上与ptY相关的位置上 。 当改变ptX的值时 , 只有堆栈上与ptX相关的内存被更新 , 改变ptX的值不会影响ptY 。 但引用类型不是这样 。 考虑下面的代码 , 它使用了System.Text.StringBuilder类:

Dim objX As New System.Text.StringBuilder("Hello World")

Dim objY As System.Text.StringBuilder

objY = objX

objX.Replace("World", "Test")

Console.WriteLine(objY.ToString())

这段代码的运行结果是Hello Test , 而不是Hello World 。 从上面使用Point示例可以看出 , 在把一个值类型赋给另一个值类型时 , 会复制存储在堆栈上的数据 。 因此 , 在前一个例子中 , 将objY赋给objX时 , 堆栈上与objX相关的数据会复制到堆栈上与objY相关的数据上 。 但是 , 在本例中 , 复制的不是实际的数据 , 而是存储在托管堆上的数据的地址 , 即objX和objY现在引用的是相同的数据 。 当堆上的数据发生变化时 , 如果某个变量保存了对该内存的引用 , 则与该变量相关的数据就会发生变化 。 这就是引用类型的默认操作方式 , 称为浅度复制(shallow copy) 。
什么是函数的参数传递呢??它有几种呢? 一般有值传递、指针传递、引用传递三种方式 。

值传递是指在调用函数时将实际参数复制一份传递到函数中 , 这样在函数中如果对参数进行修改 , 将不会影响到实际参数 。
引用传递是指在C++中 , 函数参数的传递方式有引用传递 。 所谓引用传递是指在调用函数时将实际参数的地址传递到函数中 , 那么在函数中对参数所进行的修改 , 将影响到实际参数 。
常用的参数传递方式有哪三种 常用的参数传递方式有__传地址___ , 传值和传名
函数调用时参数传递有哪几种方式? 函数的参数传递:当进行函数调用的时候 , 要填入与函数形式参数个数相同的实际参数 , 在程序运行的过程中 , 实参会将参数值传递给形参 , 这就是函数的参数传递 。
函数参数传递有以下三种:

一. 值传递
1. 用值传递方式 , 实际上是把实参的内容复制到形参中 , 实参和形参是存放在两个不同的内存空间中 。 在函数体内对形参的一切修改对实参都没有影响;

推荐阅读