/// <summary> /// 测试的运行方法 /// </summary> public static void testRun() { Console.WriteLine("test start"); int totalCount = 100000000; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < totalCount; i++) { TestRef temp = new TestRef() { Id = i, Name = "test" }; } sw.Stop(); Console.WriteLine($"引用类型实例化测试消耗:{sw.ElapsedMilliseconds}"); sw.Reset(); sw.Start(); for (int i = 0; i < totalCount; i++) { TestVal temp = new TestVal() { Id = i, Name = "test" }; } sw.Stop(); Console.WriteLine($"值类型实例化测试消耗:{sw.ElapsedMilliseconds}"); Console.Read(); }
public static void Main() { //构造引用类型实例,其内存空间 在托管堆上 分配 //tr的值是对TestRef类的实例的引用 TestRef tr = new TestRef(1, 2); //构造值类型实例,其内存空间 在线程栈上 分配 //tv的值就是TestVal结构的实例化本身 TestVal tv = new TestVal(1, 2); //输出tr,tv的值 System.Console.WriteLine("tr.a 的值是 " + tr.a); System.Console.WriteLine("tr.b 的值是 " + tr.b); System.Console.WriteLine("tv.a 的值是 " + tv.a); System.Console.WriteLine("tv.b 的值是 " + tv.b); //引用类型的赋值:将tr的值所指向的对象地址复制给tr2 //此时tr和tr2 指向同一个对象,并不需要在托管堆上重新分配空间 TestRef tr2 = tr; //值类型的赋值:在线程上重新分配空间,并将tv的值复制给tv2 //此后tv和tv2相互独立 TestVal tv2 = tv; //tr2所指对象的字段赋值,会改变tr tr2.a = 3; //tv2字段的修改不影响tv tv2.a = 3; System.Console.WriteLine("---------------------"); System.Console.WriteLine("进行 tr2.a=3 tv2.a=3 后:"); System.Console.WriteLine("tr.a 的值是 " + tr.a); System.Console.WriteLine("tr.b 的值是 " + tr.b); System.Console.WriteLine("tr2.a 的值是 " + tr2.a); System.Console.WriteLine("tr2.b 的值是 " + tr2.b); System.Console.WriteLine("tv.a 的值是 " + tv.a); System.Console.WriteLine("tv.b 的值是 " + tv.b); System.Console.WriteLine("tv2.a 的值是 " + tv2.a); System.Console.WriteLine("tv2.b 的值是 " + tv2.b); Console.ReadLine(); }