C++/CLI

论坛 期权论坛     
选择匿名的用户   2021-6-2 18:49   882   0
<div class="box2">
<span class="Tit">C&#43;&#43;/CLI</span>
</div>
<table border="0" cellpadding="0" cellspacing="0" class="htb wr" width="100%"><tbody><tr><td>
    <div class="box2 p14">
     <strong>C&#43;&#43;/CLI</strong>(
     <a href="http://baike.baidu.com/view/160512.htm" rel="noopener noreferrer" target="_blank">CLI</a>:Common Language Infrastructure)是一门用来代替
     <a href="http://baike.baidu.com/view/159906.htm" rel="noopener noreferrer" target="_blank">C&#43;&#43;托管扩展</a>(下文使用MC&#43;&#43;指代)新的语言规范。重新简化了
     <a href="http://baike.baidu.com/view/824.htm" rel="noopener noreferrer" target="_blank">C&#43;&#43;</a>托管扩展的语法,提供了更好的代码可读性。和
     <a href="http://baike.baidu.com/view/2353.htm" rel="noopener noreferrer" target="_blank">微软</a>
     <a href="http://baike.baidu.com/view/4294.htm" rel="noopener noreferrer" target="_blank">.NET</a>的其他语言一样,微软向
     <a href="http://baike.baidu.com/view/786648.htm" rel="noopener noreferrer" target="_blank">ECMA</a>提交了C&#43;&#43;/CLI的标准。C&#43;&#43;/CLI现在可以在
     <a href="http://baike.baidu.com/view/100377.htm" rel="noopener noreferrer" target="_blank">Visual C&#43;&#43;</a> 2005上开发。C&#43;&#43;/CLI的部分特性已经申请了
     <a href="http://baike.baidu.com/view/50915.htm" rel="noopener noreferrer" target="_blank">专利</a>。
     <br>
     <br>
     <strong>1 语法改变</strong>
     <br>
     <br>C&#43;&#43;/CLI是一门独立的语言(比如新的关键字),而不是像C&#43;&#43;托管扩展一样是C&#43;&#43;的超集 (C&#43;&#43;托管扩展有一些不标志的
     <a href="http://baike.baidu.com/view/390935.htm" rel="noopener noreferrer" target="_blank">关键字</a>如__gc和__value)。所以,C&#43;&#43;/CLI对于这些语法有较大的改变,尤其是去除了一些意义不明确的关键字,增加了一些.NET的特性.
     <br>
     <br>很多不一致的
     <a href="http://baike.baidu.com/view/135635.htm" rel="noopener noreferrer" target="_blank">语法</a>,像MC&#43;&#43;的不同版本用法的操作符new()被区分开:在C&#43;&#43;/CLI,.NET引用类型的创建要使用新的关键字gcnew。并且C&#43;&#43;/CLI增加了新的
     <a href="http://baike.baidu.com/view/965887.htm" rel="noopener noreferrer" target="_blank">泛型</a>概念(与C&#43;&#43; templates相似,但还是有很大的区别)。
     <br>
     <br>1.1
     <a href="http://baike.baidu.com/view/194921.htm" rel="noopener noreferrer" target="_blank">句柄</a>(Handle)
     <br>
     <br>回到MC&#43;&#43;,有两类
     <a href="http://baike.baidu.com/view/159417.htm" rel="noopener noreferrer" target="_blank">指针</a>: 用__nogc标识的指针是传统意义上的C&#43;&#43;指针,而用__gc标识的指针为.NET中的引用。但在C&#43;&#43;/CLI里,唯一的指针就是传统意义上的C&#43;&#43;指针,而.NET引用类型使用一个“句柄”来获取,使用新的语法“类名^”代替了MC&#43;&#43;的“类名*”。新的句法使得托管和非托管代码混合开发更加方便;它指明了对象将会被垃圾回收器自动销毁还是手动销毁。
     <br>
     <br>范例
     <a href="http://baike.baidu.com/view/41.htm" rel="noopener noreferrer" target="_blank">代码</a>:
     <br>
     <br>// C&#43;&#43;托管扩展
     <br>#using &lt;mscorlib.dll&gt;
     <br>using namespace System::Collections;
     <br>__gc class referencetype
     <br>{
     <br>protected:
     <br>    String* stringVar;
     <br>    int intArr __gc[];
     <br>    ArrayList* doubleList;
     <br>public:
     <br>    referencetype(String* str,int* pointer,int number) // 哪个是托管的?
     <br>    {
     <br>        doubleList &#61; new ArrayList();
     <br>        System::Console::WriteLine(str-&gt;Trim() &#43; number.ToString());
     <br>    }
     <br>};
     <br>
     <br>// C&#43;&#43;/CLI
     <br>#using &lt;mscorlib.dll&gt;
     <br>using namespace System::Collections::Generic;
     <br>ref class referencetype
     <br>{
     <br>protected:
     <br>    String^ stringVar;
     <br>    array&lt;int&gt; intArr;
     <br>    List&lt;double&gt;^ doubleList;
     <br>public:
     <br>    referencetype(String^ str,int* pointer,int number) // 不会再分不清了吧?
     <br>    {
     <br>        doubleList &#61; gcnew List&lt;double&gt;();
     <br>        System::Console::WriteLine(str-&gt;Trim() &#43; number);
     <br>    }
     <br>};
     <br>
     <br>1.2 跟踪引用(Tracking reference)
     <br>
     <br>C&#43;&#43;/CLI里的一个“跟踪引用”也是一个句柄,但它是传地址而不是传值。等同于在C#中加了“ref”关键字,或Visual Basic .NET的“ByRef”。C&#43;&#43;/CLI使用“^%”语法来定义一个跟踪引用。与传统C&#43;&#43;中的“*&amp;”语法相似。
     <br>
     <br>下面的示例了“跟踪引用”的使用。如果把“^%”改成“^”(也就是使用普通的句柄),10个字符串将不会被修改,而只会生成那些字符串的副本,这些都是因为那些引用已经不是传地址而是传值。
     <br>
     <br>int main()
     <br>{
     <br>    arr
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP