用C++/CLI搭建C++和C#之間的橋梁(二)—— 基本語法


托管對象的創建和引用

前文中我們已經演示過創建一個托管對象,對於如下C#代碼:

    System.Object x = new System.Object();

其在C++/CLI中的等價代碼如下:

    System::Object^ x = gcnew System::Object();

和傳統的C++創建的語法比較下,

    P* x = new P();

我們不難發現,對於托管對象,主要引入了如下兩個語法:

  1. 用gcnew代替new實現托管對象的創建
  2. 用^代替*實現托管對象的指針

這種方式創建的對象是可以直接被CLR支持的,可以在C#中使用。托管對象指針使用的方式和傳統的對象指針還是比較類似的,直接使用->即可:

    System::Object^ x = gcnew System::Object();
    auto str = x->ToString();

另外,C++/CLI也有一種類似於C++的對托管對象的引用的語法:

    System::Object^ x = gcnew System::Object();
    System::Object% y = *x;
    auto str = y.ToString();

由於這種方式在C#里沒有對應的語法,用起來感覺怪怪的,也不方便於其它.net語言集成。

 

托管類型的定義

我們也可以自定義托管類型,在CLR中,托管類型是分為引用類型(class)和值類型(struct)的,在C++/CLI中的分別定義方式如下:

引用類型:

    public ref class MyClass
    {
    };

值類型:

    public value class MyClass
    {
    };

在ISO C++中類定義中加上了ref或value標記為托管類型,還算比較容易使用。

 

枚舉

枚舉的定義和C++11的enum class一樣,它像數字那樣可以同時應用於托管類型和非托管類型。

    public enum class SomeColors { Red, Yellow, Blue };

或者更精確的表示:

    public enum class SomeColors : char { Red, Yellow, Blue };

 

數組

C++/CLI中新增了array<T> ^的方式定義數組。

    array<int> ^a = gcnew array<int>(100) { 1, 2, 3 };

或者使用它的完整版:

    cli::array<int> ^a = gcnew cli::array<int> {1, 2, 3};

 

不定參數

對於C#中的不定參數的語法:

    void foo(params string[] args)

在C++/CLI中對應的版本為:

    void foo(... array<String^>^ args)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM