托管对象的创建和引用
在前文中我们已经演示过创建一个托管对象,对于如下C#代码:
1
|
System.Object x = new System.Object(); |
其在C++/CLI中的等价代码如下:
1
|
System::Object^ x = gcnew System::Object(); |
和传统的C++创建的语法比较下,
1
|
P* x = new P(); |
我们不难发现,对于托管对象,主要引入了如下两个语法:
-
用gcnew代替new实现托管对象的创建
-
用^代替*实现托管对象的指针
这种方式创建的对象是可以直接被CLR支持的,可以在C#中使用。托管对象指针使用的方式和传统的对象指针还是比较类似的,直接使用->即可:
1
2
|
System::Object^ x = gcnew System::Object(); auto str = x->ToString(); |
另外,C++/CLI也有一种类似于C++的对托管对象的引用的语法:
1
2
3
|
System::Object^ x = gcnew System::Object(); System::Object% y = *x; auto str = y.ToString(); |
由于这种方式在C#里没有对应的语法,用起来感觉怪怪的,也不方便于其它.net语言集成。
托管类型的定义
我们也可以自定义托管类型,在CLR中,托管类型是分为引用类型(class)和值类型(struct)的,在C++/CLI中的分别定义方式如下:
引用类型:
1
2
3
|
public ref class MyClass { }; |
值类型:
1
2
3
|
public value class MyClass { }; |
在ISO C++中类定义中加上了ref或value标记为托管类型,还算比较容易使用。
枚举
枚举的定义和C++11的enum class一样,它像数字那样可以同时应用于托管类型和非托管类型。
1
|
public enum class SomeColors { Red, Yellow, Blue }; |
或者更精确的表示:
1
|
public enum class SomeColors : char { Red, Yellow, Blue }; |
数组
C++/CLI中新增了array<T> ^的方式定义数组。
1
|
array< int > ^a = gcnew array< int >(100) { 1, 2, 3 }; |
或者使用它的完整版:
1
|
cli::array< int > ^a = gcnew cli::array< int > {1, 2, 3}; |
不定参数
对于C#中的不定参数的语法:
1
|
void foo( params string [] args) |
在C++/CLI中对应的版本为:
1
|
void foo(... array<String^>^ args) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/TianFang/p/4937779.html