e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 程序开发 >> ASP.net教程 >> C++:最强大的.NET语言之可访问性 >> 教程正文
 
教程搜索
 
 
相关教程
  • C++/CLI实战——HELLO
  • VC编写简单的序列号(SN)填
  • Visual Studio 2005体验泛
  • C++/CLI基本数据类型探索
  • 用托管C++编写Windows服务
  • Visual C++ 2005图像编程
  • Visual C++ 2005图像编程
  • Visual C++ 2005图像编程
  • 把其他C/C++编译器集成到
  • VC.NET实现清爽便利的Win
  • C++:最强大的.NET语言之
  • C++:最强大的.NET语言之
  • C++:最强大的.NET语言之
  • C++:最强大的.NET语言之
  • Visual C++2005中开发自定
  • C++/CLI程序进程之间的通
 
 
赞 助 商
 
 
C++:最强大的.NET语言之可访问性
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9

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类的简单示例,允许你排列一系列的函数指针,并在工作者线程中执行。

class 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

[1] [2] 下一页

  • 上一篇教程: C++:最强大的.NET语言之装箱
  • 下一篇教程: VC.NET实现清爽便利的Windows游戏窗口
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.