我知道我也不是在问这个问题.请帮我更好地形成我的问题.
我有点困难让我的思绪缠绕在手柄上 - 在某些方面,它看起来像指针.但与指针不同,似乎我可以直接将值赋给handle变量,它会影响底层数据值,而不是句柄本身.
测试代码清楚地表明,无论是否使用句柄,我都得到相同的值,或者如果我"取消引用"句柄来获取数据.显然,这不适用于非托管指针.我不明白的是什么?
#includeint main() { int ^y; int ^a, ^b, ^c; long x; y= gcnew int(100); a=y; b=y; c=y; c= gcnew int(200); b= 300; System::Console::WriteLine(y); // returns 100 (instead of something pointer-like) System::Console::WriteLine(*y); // also returns 100 System::Console::WriteLine(a); // 100 System::Console::WriteLine(b); // 300 System::Console::WriteLine(c); // 200 x = static_cast (y); *y = 10; System::Console::WriteLine(x); // 10 System::Console::WriteLine(y); // 10 System::Console::WriteLine(*y); // 10 }
编辑添加 - 我怀疑WirteLine可能已经为我做了解除引用,但我原本预计静态强制转换不会.这与autounboxing有关吗?
C++/CLI允许这种语法有点令人遗憾.int类型是值类型,hat用于引用类型.您的"y"变量不存储int,它存储System :: Object.分配时,编译器会自动生成装箱指令.Console :: WriteLine()在显示一个盒装int的对象的值时没有问题.
经验法则:当它是一个类对象时使用hat,对于简单的值类型省略它.避免引用类型的堆栈语义(省略hat,以便在作用域结束时自动调用析构函数),直到你真正理解值和引用类型之间的差异以及为什么Dispose()很重要.