C++/CLI 要点

1.  ^和*

     ^表示托管类型的引用

     *表示非托管类型的指针

// C++托管扩展 #using <mscorlib.dll> using namespace System::Collections; __gc class referencetype { protected: String* stringVar; int intArr __gc[]; ArrayList* doubleList; public: referencetype(String* str,int* pointer,int number) // 哪个是托管的? { doubleList = new ArrayList(); System::Console::WriteLine(str->Trim() + number.ToString()); } }; // C++/CLI #using <mscorlib.dll> using namespace System::Collections::Generic; ref class referencetype { protected: String^ stringVar; array<int> intArr; List<double>^ doubleList; public: referencetype(String^ str,int* pointer,int number) // 不会再分不清了吧? { doubleList = gcnew List<double>(); System::Console::WriteLine(str->Trim() + number); } };

 

2. %表示引用

int main() { array<String^>^ arr = gcnew array<String^>(10); int i = 0; for each(String^% s in arr) s = gcnew String(i++.ToString()); return 0; }

 

3. dispose和finalize

 // C++/CLI ref class MyClass // :IDisposable (编译器自动实现IDisposable接口) { public: MyClass(); // 构造函数 ~MyClass(); // (确定的) 析构函数 (编译器使用IDisposable.Dispose来实现) protected: !MyClass(); // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现) public: static void Test() { MyClass auto; // 这不是个句柄,它将调用MyClass的默认构造函数 // 使用auto对象 // 函数返回前自动调用auto的析构函数(IDisposable.Dispose,由~MyClass()定义)来释放资源 // 以上代码等效于: MyClass^ user = gcnew MyClass(); try { /* 使用auto对象 */ } finally { delete user; /* 由编译器调用auto.Dispose() */ } } }; // C# class MyClass : IDisposable { public MyClass() {} // 构造函数 ~MyClass() {} // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效 public void Dispose() {} // Dispose方法 public static void Test() { using(MyClass auto = new MyClass()) { /* 使用auto对象 */ } // 因为使用了using句法,编译器自动调用auto.Dispose() // 以上代码等效于: MyClass user = new MyClass(); try { /* 使用user对象 */ } finally { user.Dispose(); } } }

你可能感兴趣的:(C++,String,Collections,System,Class,编译器)