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

     

  • 相关阅读:
    使用简单的反射技术重构组合查询串功能
    沤血分享之:使用Opera浏览器技巧全集
    项目中用到的RE分析
    关于调用新浪微博与腾讯微博
    正则 (?i,m,s,x,g)
    求职路 第二章 深圳篇
    12320平台架构及部署
    网站会员密码
    求职路 第二章 技术篇
    TFS故障一二
  • 原文地址:https://www.cnblogs.com/TianFang/p/4937779.html
Copyright © 2020-2023  润新知