赋值和引用

       对于基本类型,Java是传值的副本;对于一切对象型变量,Java都是传引用的副本。

       “=”不是赋值语句,右边对象地址传给了左边的引用,使得左边的引用指向了右边的对象。对象存储于堆中,引用存储于速度更快的堆栈上。

       “=”语句左边是引用(存在栈中),右边new出来的是对象(存在堆中)。“=”左右都是引用的语句,左右引用同时指向了右边引用所指向的对象。

       参数传值,都是传递参数的副本,都是传值。

在C#中,传值赋值引用传值是两种不同的数据传递方式,它们的原理及区别如下: ### 传值赋值 传值赋值时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应地复制给形参。此后,被调用方法中形参值的任何改变都不会影响到相应的实参。例如,当传递一个值类型的变量时,传递的是该变量所存储的实际数据。C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct) [^2][^3]。 ### 引用传值 引用传值时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参。因此,形参所引用的该地址上的变量与传递的实参相同,方法体内相应形参值的任何改变都将影响到作为引用传递的实参。引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址,并不包含数据。当声明一个引用类型变量时,该变量会被分配到栈上。如果仅仅只是声明这样一个变量,由于在堆上还没有创建该类型的实例,因此,变量值为null,意思是不指向任何类型实例(堆上的对象)。C#中的引用类型分为引用引用的对象,包括类类型、接口类型、数组类型委托类型 [^2][^1][^4]。 ### 代码示例 ```csharp using System; class Program { // 传值赋值示例 static void ValuePassing(int value) { value = 10; } // 引用传值示例 class MyClass { public int Value; } static void ReferencePassing(MyClass obj) { obj.Value = 20; } static void Main() { // 传值赋值 int num = 5; ValuePassing(num); Console.WriteLine($"传值赋值后num的值: {num}"); // 输出: 5 // 引用传值 MyClass myObj = new MyClass { Value = 15 }; ReferencePassing(myObj); Console.WriteLine($"引用传值后myObj.Value的值: {myObj.Value}"); // 输出: 20 } } ``` 在上述代码中,`ValuePassing` 方法接收一个 `int` 类型的参数,这是一个值类型,方法内部对形参的修改不会影响到实参。而 `ReferencePassing` 方法接收一个 `MyClass` 类型的对象,这是一个引用类型,方法内部对形参的修改会影响到实参。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值