C++ 托管扩展语法升级清单
更新:2007 年 11 月
对于 Visual C++ 2005,Visual C++ 提供了一些功能,这些功能面向带有垃圾回收的虚拟机,如 .NET Framework。对于 Visual C++ 2008,已不支持 Managed Extensions for C++,并可能在未来发行版中完全移除。
使用 C++ 托管扩展的代码仍可以通过 /clr:oldSyntax 进行编译。请参见 /clr(公共语言运行库编译) 以获得更多信息。有关使用新语法的更多信息,请参见:
本主题列出了 C++ 托管扩展和新的 Visual C++ 语法之间的语法差异。
更新 C++ 托管扩展代码
移除 #using <mscorlib.dll>。(现在,默认情况下引用此程序集。)
将 __gc class 替换为 ref class。
将 __gc struct 替换为 ref struct。
将 __value class 替换为 value class。
将 __value struct 替换为 value struct。
从值类中移除默认构造函数。(C++ 托管扩展中允许使用值类型的默认构造函数,但 CLR 的性质妨碍了对这些构造函数进行可靠的调用,因此移除了此功能。)
有关引用类型和值类型的更多信息,请参见 Classes and Structs (Managed)。
- 将 __gc __interface 替换为 interface class。
有关接口关键字的更多信息,请参见 interface class。
将 __abstract 替换为 abstract,并将其移动到类名的后面。有关更多信息,请参见 abstract (C++)。
将 __property 替换为 property,将 get 和 set 方法组合到一个属性块中,并从这些访问器中移除尾部下划线/名称后缀。对于简单属性,无需显式定义访问器。索引属性的语法要求在属性类型后使用一对括号。有关更多信息,请参见 How to: Use Simple Properties 和 How to: Use Indexed Properties。
将 __event 替换为 event (C++)。
将 __value enum 替换为 enum class。
将指向后跟引用类型(使用 __gc* 定义)的指针替换为 ^。有关更多信息,请参见 ^ (Handle to Object on Managed Heap)。
将指向可能存在于垃圾回收堆中的值类型的指针替换为 interior_ptr。
将使用 __pin 声明的指针替换为 pin_ptr 的实例,除非整个对象都已固定,在此情况下,将对内部指针先使用 interior_ptr,然后使用 pin_ptr。对于 Visual C++ 2005,此模板在 cli Namespace 中定义。
将 new 替换为 gcnew。
当 0 或 null 值用于指示指向垃圾回收堆的指针或句柄不指示对象时,或使用比较来检查指针和句柄时,将 0 或 null 值替换为 nullptr。
将使用 __gc[] 声明的垃圾回收数组更新为使用 array 类型。对于 Visual C++ 2005,此模板在 cli Namespace 中定义。
移除 __box 的所有实例。有关更多信息,请参见Implicit Boxing。
从字符串中删除“S”前缀(现在,编译器根据使用字符串的上下文来确定字符串是否是文本。)
将 C++ 托管扩展中要求的显式声明和重载运算符用法(如 op_Addition、op_Subtraction)替换为传统的 C++ 语法。有关更多信息,请参见 User-Defined Operators 和 Operator Overloading。
更新转换运算符(这些运算符使用 C++ 托管扩展语法中的 op_Implicit 和 op_Explicit)。有关更多信息,请参见 User-Defined Conversions。
将 __try_cast 替换为 safe_cast。对于 Visual C++ 2005,此模板在 cli Namespace 中定义。
如果要对具有 CLR 的程序集签名属性的程序集进行签名(又称作赋予程序集强名称),则应当从代码中移除这些属性,并改用程序集签名链接器选项。有关更多信息,请参见 强名称程序集(程序集签名)。