VB 参数传递:按值传递和按地址传递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB 参数传递:按值传递和按地址传递相关的知识,希望对你有一定的参考价值。

参考技术A vb默认的是按地址传递,也就是说按地址传递是形参和实参共享同一内存单元,如在hcf(x,
y)中,x和y与m和n其实是同一变量,当mn改变时xy也改变,一次hcf函数过程下来m=24,n=4,也就是说x=24,y=4,所以在label2.caption
=
x
&
","
&
y
&
"中,出现了24,4
而用括号的话就是表示按值传递,vb会为mn另外分配内存单元,mn值的改变并不会影响xy的值,所以下面那个label2.caption
=
m
&
","
&
n
&
"中,依然是136.28
参考技术B 问题一
参数按地址传递,输出结果为什么是“8”,而不是“9”。因为变量a没作为参数传递。改s
(a)为s
a
或Print
(a)试试。
问题二
参数传递的数量不是只能一个
比如:
s(byval
a,byref
b)可以的

C#基础按值和按引用传递参数

【C#基础】按值和按引用传递参数

我们通常提到的C#中的值和引用,大多数是值类型和引用类型。 所谓的值类型是直接存储数据的值,保存在内存中的; 而引用类型是存储对值的引用,实际上存储的是一个内存地址。
值类型包括结构体(struct)和枚举(enum);引用类型包括 类(class),接口(interface),委托(delegate),数组(array)等。
那么,值类型和引用类型在传递参数时又有什么不同呢?
传值类型参数无需额外的修饰符,传引用类型参数与之最大的区别是在参数前面使用ref或者out关键字。C#中方法的参数传递 默认是值传递
下面我们通过举例来说明:
假设有一个类型A,它有一个int类型的属性X。ChangeA方法接收类型A的参数,把X的值改为2

public static void ChaneA(A a){a.X= 2;}

Main()方法创建类型A的实例,把X初始化为1,调用ChangeA方法:
static void Main(){ Aa1 = new A {x = 1 }

ChangeA(a1);
Console.WriteLine($”a1.X:{a1.X}”);

输出是什么?1还是2?
答案视情况而定。需要知道A是一个类还是结构。
类和结构
①.假定A是结构 (值类型参数)

public struct Apublicint X{get;set;}}

我们知道结构按值传递,通过值传递,ChangeA方法中的变量a得到堆栈中变量a1的一个副本。在方法ChangeA中修改并销毁副本。a1的内容从不改变,一直是1。
②.假定A是类 引用类型参数

public class A{ public int X{get;set;}}

类是按引用传递 。a变量把堆上的同一个对象引用为变量a1。当ChangA修改a的X属性值时,把它改为a1.X,因为它是同一个对象。 这里,结果是2。
ref参数
①.值类型
如果A是结构类型,就添加ref修饰符,修改ChangeA方法的声明,通过引用传递变量:

publicstatic void ChangeA(ref A a){ a.x = 2;}

从调用端也可以看出这一点,所以给方法参数应用了ref修饰符后,在调用方法时需要添加它:

Staticvoid Main()
{
    A a1 = new A{X = 1};
    ChangeA(ref a1);
    Console.WriteLine($”a1.X:{a1.X}”);
}

由于结构也按引用类型传递,所以结果是2。

②.引用类型
如果A是类类型,修改ChangeA方法

publicstatic void ChangeA(ref A a)
{
    a.X = 2;
    a= new A{X = 3};
}

把A作为类类型使用ref修饰符,传递对引用的引用,它允许分配一个新对象,Main()方法显示了结果3。

out参数
Out关键字通过引用传递参数,若要使用out参数,方法定义和调用方法均必须显示使用out关键字,例如:
Stringinput1 = ReadLine();
If(int.TryParse(input1,outint result1))
{
    Console.WriteLine($”result:{result1}”);
}
else
{
    Console.WriteLine(“not a number”);
}


注意:作为out参数传递的变量在方法调用中传递之前不必进行初始化。但是,被调用的方法需要在返回之前赋一个值。

点击 参与讨论 一起聊聊吧!
嘿星星 发起了一个读者讨论 为什么要有“引用传递”这回事?

加入我们
一起讨论、学习、打卡吧!

以上是关于VB 参数传递:按值传递和按地址传递的主要内容,如果未能解决你的问题,请参考以下文章

VB系统中默认的参数传递方式?

向过程传递参数有啥传递和啥传递两种方法,其中啥是VB默认的参数传递方式?

Python按值传递参数和按引用传递参数

方法传递参数&按值传递和按引用传递

C#基础按值和按引用传递参数

按值和按引用传递参数