• 用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)

     

  • 相关阅读:
    tyvj[1087]sumsets
    tyvj[1089]smrtfun
    [bzoj3289]Mato的文件管理
    luogu[2093]零件分组
    luogu[1135]奇怪的电梯
    codevs[1300]文件排版
    luogu[1140]相似基因
    动态规划练习题 胖男孩
    动态规划练习题 汇率
    vijos[1355]车队过桥问题
  • 原文地址:https://www.cnblogs.com/TianFang/p/4937779.html
Copyright © 2020-2023  润新知