本文主要是介绍【微软技术栈】与其他.NET语言的互操作性 (C++/CLI),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文内容
- 使用 C# 索引器
- 实现 C# 的 is 和 as 关键字
- 实现 C# 的 lock 关键字
本节中的主题介绍如何在 Visual C++ 中创建程序集,这些程序集使用或提供以 C# 或 Visual Basic 编写的程序集的功能。
1、使用 C# 索引器
Visual C++ 不包含索引器;它具有索引属性。 若要使用 C# 索引器,请访问索引器,就像它是索引属性一样。
示例
以下 C# 程序定义索引器。
// consume_cs_indexers.cs
// compile with: /target:library
using System;
public class IndexerClass {private int [] myArray = new int[100];public int this [int index] { // Indexer declarationget {// Check the index limits.if (index < 0 || index >= 100)return 0;elsereturn myArray[index];}set {if (!(index < 0 || index >= 100))myArray[index] = value;}}
}
/*
// code to consume the indexer
public class MainClass {public static void Main() {IndexerClass b = new IndexerClass();// Call indexer to initialize elements 3 and 5b[3] = 256;b[5] = 1024;for (int i = 0 ; i <= 10 ; i++)Console.WriteLine("Element #{0} = {1}", i, b[i]);}
}
*/
此 C++/CLI 程序使用索引器。
// consume_cs_indexers_2.cpp
// compile with: /clr
#using "consume_cs_indexers.dll"
using namespace System;int main() {IndexerClass ^ ic = gcnew IndexerClass;ic->default[0] = 21;for (int i = 0 ; i <= 10 ; i++)Console::WriteLine("Element #{0} = {1}", i, ic->default[i]);
}
此示例产生以下输出:
Element #0 = 21
Element #1 = 0
Element #2 = 0
Element #3 = 0
Element #4 = 0
Element #5 = 0
Element #6 = 0
Element #7 = 0
Element #8 = 0
Element #9 = 0
Element #10 = 0
2、实现 C# 的 is 和 as 关键字
本主题演示如何在 Visual C++ 中实现 C# 的 is
和 as
关键字的功能。
示例
// CS_is_as.cpp
// compile with: /clr
using namespace System;interface class I {
public:void F();
};ref struct C : public I {virtual void F( void ) { }
};template < class T, class U >
Boolean isinst(U u) {return dynamic_cast< T >(u) != nullptr;
}int main() {C ^ c = gcnew C();I ^ i = safe_cast< I ^ >(c); // is (maps to castclass in IL)I ^ ii = dynamic_cast< I ^ >(c); // as (maps to isinst in IL)// simulate 'as':Object ^ o = "f";if ( isinst< String ^ >(o) )Console::WriteLine("o is a string");
}
输出结果:
o is a string
3、实现 C# 的 lock 关键字
本主题演示如何在 Visual C++ 中实现 C# lock
关键字。
示例
// CS_lock_in_CPP.cpp
// compile with: /clr
using namespace System::Threading;
ref class Lock {Object^ m_pObject;
public:Lock( Object ^ pObject ) : m_pObject( pObject ) {Monitor::Enter( m_pObject );}~Lock() {Monitor::Exit( m_pObject );}
};ref struct LockHelper {void DoSomething();
};void LockHelper::DoSomething() {// Note: Reference type with stack allocation semantics to provide// deterministic finalizationLock lock( this );// LockHelper instance is locked
}int main()
{LockHelper lockHelper;lockHelper.DoSomething();return 0;
}
这篇关于【微软技术栈】与其他.NET语言的互操作性 (C++/CLI)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!