托管对象的创建和引用

前文中我们已经演示过创建一个托管对象,对于如下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)

用C++/CLI搭建C++和C#之间的桥梁(二)—— 基本语法的更多相关文章

  1. 用C++/CLI搭建C++和C#之间的桥梁(一)—— 简介

    C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于访问底层模块和 ...

  2. 用C++/CLI搭建C++和C#之间的桥梁

    一.简单用法 C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于 ...

  3. 用C++/CLI搭建C++和C#之间的桥梁(四)—— 网络资源

    关于C++/CLI的基础,我前面已经写过了几篇文章介绍过一些了,不过这些基本上都是管中窥豹,如果要详细了解C++/CLI,MSDN无疑是最好的教程. 使用 C++ 互操作(隐式 PInvoke) Vi ...

  4. 用C++/CLI搭建C++和C#之间的桥梁(三)—— 基本类型

    数值类型 对于基本的数值类型,在C++/CLI中是可以直接映射为托管类型的数值的,可以同时应用于托管类型和非托管类型,编译器会将其自动转换. 基本类型 System命名空间中对应的类 注释/用法 bo ...

  5. vue cli搭建项目及文件引入

    cli搭建方法:需安装nodejs先 1.npm install -g cnpm --registry=https://registry.npm.taobao.org //安装cnpm,用cnpm下载 ...

  6. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— 准备

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

  7. [转]搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  8. 搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  9. [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

    原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...

随机推荐

  1. Hashtable之Properties

    properties的使用:1.Hashtable的实现类,线程安全.与HashMap不同,Hashtable不允许使用null作为key和value2.和HashMap一样,Hashtable也不能 ...

  2. Python中raw_input() & input() 的功能对比

    raw_input的功能是方便的从控制台读入数据.  input与raw_input都是Python的内建函数,实现与用户的交互,但是功能不同. 一.raw_input 下面介绍让raw_input的 ...

  3. JSP基础与提高(一).md

    JSP基础 JSP的由来 1.1. 为什么有JSP规范 Servlet技术产生以后,在使用过程中存在一个很大的问题,即为了表现页面的效果而需要输出大量的HTML标签,这些标签在Servlet中表现为一 ...

  4. Visual Tracking with Fully Convolutional Networks

    http://blog.csdn.net/carrierlxksuper/article/details/48918297 传统的跟踪方法依赖低维的人工特征,但这种特征对目标的外观变化等问题不够鲁棒. ...

  5. 线性SVM的推导

    线性SVM算法的一般过程 线性SVM的推导 超平面方程 SVM是用来分类的.给定一系列输入数据(n维向量),需要找到一个切分界线(n-1维的超平面),这里假定数据是线性可分的.比如,二维数据的超平面是 ...

  6. PyCharm中 ImportError: No module named tensorflow

    安装完 tensorflow 后在 PyCharm 中导入时显示找不到,可设置如下: PyCharm 中依次打开 File -> Settings -> Project:PycharmPr ...

  7. java SE :标准输入/输出

    一 标准设备输入/输出 A 标准输入/输出类 System B 控制台读写类 Console  标准输入/输出类  System 1 标准输入.标准输出.错误输出流 // 标准输入流 public f ...

  8. CoreOS中随着系统启动Docker Container

    Start containers automatically https://docs.docker.com/engine/admin/host_integration/ https://www.fr ...

  9. 【LOJ】#2085. 「NOI2016」循环之美

    题解 我们要求的其实是这个东西= = \(\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i,j) == 1][(j,k) == 1]\) 然后变一下形 \(\sum_{j = 1 ...

  10. bzoj 1112 treap树

    思路:我们只要check一遍每个长度为k的区间就好啦,对于一个区间来说的最优值显然是中位数,我们显然要动态求 第k大,所以需要一个二叉搜索树,用treap就好啦. #include<bits/s ...