日期:2011-03-22 13:56:00 来源:本站整理
C++:最强盛的.NET语言之可拜候性[VC/C++编程]
本文“C++:最强盛的.NET语言之可拜候性[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
CLR定义了一些用于拜候存取的修饰成份,其作用超越了本地C++中类成员函数与变量的对等物(如:public、private、protected),不但如此,乃至还能定义命名空间或嵌套范例的可拜候性.为了让C++/CLI到达作为初级语言的目标,除拜候性之外,它还供应了比其他CLR平台高级语言更多的掌握.
本地C++可拜候性与CLR中定义的可拜候性相比,其最大差别之处在于:本地C++拜候指导符普通用于限制同一程序中从其他代码拜候类成员;而CLR定义的范例和成员的可拜候性,不只是针对同一程序集合的其他代码,还针对从其他程序集合引用它的代码.
一个命名空间,或非嵌套范例,如class或delegate范例,可在范例定义之前,通过加上public或private关键字来指定程序集之外的可见度.
public ref class ReferenceType {};
假如显式地指定了可见度,对程序集来说,范例会被假定为私有范例(private).
类成员的拜候指导符一样也被扩大,以答应一同利用两个关键字来指定来自内部和外部的拜候.在这两个关键字中,限制更多的一者定义了来自程序集外的拜候性,而别的一个则定义了程序集内的拜候性.假如只用了一个关键字,那它将同时作用于内部与外部的拜候性.这种计划思惟对定义范例与类成员的可拜候性供应了宏大的弹性,以下是示例:
public ref class ReferenceType
{
public:
//程序集内部与外部都可见
private public:
//只对程序集内部可见
protected public:
//对程序集内全部代码可见;对外部担当范例可见
};
属性
除嵌套范例之外,CLR范例只能包含办法与字段.为了让程序员更清楚地表达代码内涵,可以利用元数据来指明某特定的办法将被编程语言当作属性.严峻来说,一个CLR属性是它的包含类的一个成员,但是,属性没有分配的存储空间,它只是实现属性的各自办法的一个命名引用,而差别的编译器,碰到源代码中有关属性的语法时,将会生成各自所需的元数据.这就是说,范例的利用者,可在它们的语言中利用属性语法,来拜候实现属性的get和set办法.与本地C++相比,C#对属性支持最好.
public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}
C#编译器会生成对应的get_Name与set_Name办法,并且也会包含必要的元数据以指明其接洽.在托管C++中,引入了关键字__property来指明一个在语义上实现属性的办法.
__property String* get_Name()
{
return m_value;
}
__property String* set_Name(String* value)
{
m_value = value;
}
很明显,这不是抱负的情形,不但需求利用这个"丢脸"的__property关键字,并且此处没有任何东西清楚地指明这两个成员函数实际上的接洽,这在保护期间,会招致难以捉摸的bug.C++/CLI在对属性的计划上,就显得简明多了,更接近于C#的计划,并且你还会发现,这更强盛.
property String^ Name
{
String^ get()
{
return m_value;
}
void set(String^ value)
{
m_value = value;
}
}
这是一个非常大的改良,由编译器负责生成get_Name与set_Name办法和在此属性中声明的必要的元数据.更好的是,此属性值可对程序集外部保持只读,而对程序集内部为可写,也可以在紧接着属性名的花括号中利用拜候指导符来到达这一目的.
property String^ Name
{
public:
String^ get();
private public:
void set(String^);
}
最后一点无关痛痒的事是,在那此不需求对属性中get和set作特别处理的地方,也可以利用简单表示法.
property String^ Name;
再次提醒,编译器会生成get_Name与set_Name办法,但是这个时刻,也会供应一个由private String ^ 成员变量支持的默许实现.其好处是,你可在将来某个时刻,用其他某种实现,来替换掉此处的简易属性,并且不会破坏类的接口.
代理
本地C++中的函数指针,供应了一种异步履行代码的机制,你可以存储一个函数指针,而在今后有需求的时刻及时地调用,这普通用于把某算法与实现代码脱离来,如在搜索中对比对象.别的,它也可在差别的线程中调用,以实现真实的异步编程.以下是一个ThreadPool类的简单示例,答应你布列一系列的函数指针,并在工作者线程中履行.
{
public:
template <typename T>
static void QueueUserWorkItem(void (T::*function)(), T* object)
{
typedef std::pair<void (T::*)(), T*> CallbackType;
std::auto_ptr<CallbackType> p(new CallbackType(function, object));
if (::QueueUserWorkItem(ThreadProc<T>,
p.get(),
WT_EXECUTEDEFAULT))
{
//ThreadProc负责删除pair.
p.release();
}
else
{
AtlThrowLastWin32();
}
}
private:
template <typename T>
static DWORD WINAPI ThreadProc(PVOID context)
{
typedef std::pair<void (T::*)(), T*> CallbackType;
std::auto_ptr<CallbackType> p(static_cast<CallbackType*>(context));
(p->second->*p->first)();
return 0;
}
ThreadPool();
};
在C++中利用线程池是简单兼自然的.
class Service
{
public:
void AsyncRun()
{
ThreadPool::QueueUserWorkItem(Run, this);
}
void Run()
{
//其他代码
}
}
很明显,ThreadPool类是非常受限的,它只能承受特定的函数指针,这只是示例本身而不是C++本身的范围性.
当C++程序员想要实现或得到用于异步编程的丰富库函数时,带着有此内置支持的CLR来了."代理"与函数指针非常近似,除了针对的目标及办法属于的范例(其不能决意能否一个代理可以绑定于一个给定的办法);只要范例匹配,办法就可以被代理,并在今后调用,与上面利用C++模板来实现答应承受任何类成员函数的例子对比,这在思惟上是类似的.当然,代理还供应了更多且极端有效的间接函数调用的机制,以下是在C++/CLI中定义一个代理范例的示例:
delegate void Function();
利用代理也非常直截了当.
ref struct ReferenceType
{
void InstanceMethod() {}
static void StaticMethod() {}
};
//成立代理并绑定到成员函数的实例
Function^ f = gcnew Function(gcnew ReferenceType, ReferenceType::InstanceMethod);
//也可绑定到静态成员函数,并结合几个代理形成代理链
f += gcnew Function(ReferenceType::StaticMethod);
//调用函数
f();
完毕语
关于C++/CLI,真是说上几天也说不完,新的语言计划供应了空前的威力和绝无唯一的"文雅"语法,并且可在不牺牲简便性、编程效率、履行效率的情形下,完好地利用C++来编写丰富的 .NET利用程序.
以上是“C++:最强盛的.NET语言之可拜候性[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论