我只是偶然发现了这段代码,一些谷歌搜索没有找到对这种神秘语法的解释(对我来说)。
Hashtable^ tempHash = gcnew Hashtable(iterators_); IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
这个插入符号到底是什么意思?(gcnew对我来说也是新的,我问过那个在这里。)
gcnew
这意味着它是对托管对象的引用。
这是c++ / CLI,插入符号是*(指针)的托管等价物,在c++ /CLI术语中,它被称为指向“引用类型”的“处理”(因为你仍然可以有非托管指针)。
(感谢Aardvark指出了更好的术语。)
这意味着这是对托管对象的引用,而不是普通的c++指针。这些引用背后的对象由运行时管理,并可以在内存中重新定位。它们也会自动进行垃圾回收。
在c++ /CLI中,它表示托管指针。你可以在这里阅读更多关于它(以及其他c++ /CLI特性):
http://en.wikipedia.org/wiki/C%2B%2B/CLI
从MSDN来看,插入符号似乎意味着您正在获取正在创建的类型的句柄。
https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/te3ecsc8%28VS.80%29.aspx
当分配托管内存时,垃圾收集器可以移动该内存。^操作符是托管内存的指针,即使垃圾收集器移动它所指向的对象,它也会继续指向正确的位置。
^
// here normal pointer P* ptr = new P; // usual pointer allocated on heap P& nat = *ptr; // object on heap bind to native object //.. here CLI managed MO^ mngd = gcnew MO; // allocate on CLI heap MO% rr = *mngd; // object on CLI heap reference to gc-lvalue
通常,标点符号%对应于^,就像标点符号&对应于*一样。在c++中,一元&操作符在c++ /CLI中是一元%操作符。
%
&
*
&ptr产生P*,而%mngd产生MO^。
&ptr
P*
%mngd
MO^
下面的几句话也值得考虑,它们用一种略微不同的方式回答了这个问题:
句柄声明器(^,发音为"hat"),修改类型说明符,意味着当系统确定该对象不再可访问时,应自动删除已声明的对象。
因为原生c++指针(*)和引用(&)不是托管引用,垃圾收集器不能自动更新它们所指向的地址。要解决这个问题,请使用句柄声明器指定一个垃圾收集器可以识别并可以自动更新的变量。
(和“native"I.M.H.O.这个词是不是比“手柄”更好,因为手柄这个词可能是由“Windows SDK”的使用而引入的)