C# 值类型和引用类型等值判断
程序员文章站
2023-12-02 12:13:52
运行结果: ......
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 堆和栈
{
class program
{
static void main(string[] args)
{
#region 引用类型
// s : 对象的引用【存储在栈中】
//new student() 【对象存储在堆中】
student s = new student();//引用类型
s.age = 88;
console.writeline("初始对象s的age是:" + s.age.tostring()); // 输出:88
student s2 = s;//给引用类型赋值的时候,其实只是赋值了对象的引用【即是在栈中赋值了对象的引用,s和s2的引用地址都指向同一个堆上的地址】
s2.age = 44;
console.writeline("引用类型赋值后对象s2的age是:" + s2.age.tostring());// 输出:44
console.writeline("引用类型赋值后对象s的age是:" + s.age.tostring());// 输出:44
#endregion
#region 值类型
//局部变量 【存储在栈中】
int aaa = 0;//值类型
console.writeline("初始aaa变量的值是:" + aaa.tostring()); // 输出:0
int aaa2 = aaa;//给值类型变量赋值的时候,是创建了一个副本(即克隆,aaa2 和aaa没一毛钱关系)
aaa2 = 99;
console.writeline("值类型赋值后aaa变量的值是:" + aaa.tostring()); // 输出:0
console.writeline("值类型赋值后aaa2变量的值是:" + aaa2.tostring()); // 输出:99
#endregion
#region 等值判断
int i = 3;
int j = 3;
console.writeline("值类型等值判断:"+(i == j).tostring());// 输出:true ,值类型等值判断直接比较值本身
student a = new student();
a.age = 3;
student b = new student();
b.age = 3;
console.writeline("引用类型等值判断:"+(a == b).tostring());// 输出:false ,引用类型等值判断的是栈中的地址,不是比较数据的本身
//引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变,二者就像绑定在了一起。
student c = a;
console.writeline("引用类型等值判断:" + (a == c).tostring());// 输出:true ,引用类型等值判断的是栈中的地址,不是比较数据的本身
#endregion
console.readkey();
}
}
}
运行结果: