C#中类间通信方法

    C#中没有自由函数也没有自由变量,所有的一切都必须封装在类中。在C++中,通过全局变量来进行函数间通信和类间通信是常用的方法,然而这在C#中却变成不可能任务,这的确让C++程序员苦恼。C#当然有它充分的理由不支持自由函数和自由变量,因为“自由”就暗示着冲突、不安全等等影响程序健壮性和可维护性的因素。当然有很多技术可以解决C#中的类间通信问题,本文就介绍其中的几种。

一.问题域涉及的主要Class

 

 

在介绍之前先作一下说明。一般我们可以把类间通信时需要的各相关数据元素封装成一个结构,我称之为“通信结构”,将其记为Information struct ,它是一个纯粹的C结构,即除了公共的数据成员外,什么都没有。当类间需要交换消息时就可以生成一个“通信结构”实例,然后在类间传递。另外我把提供信息的类称为Provider Class (以下简称为Provider),接受信息的类称为Master Class(以下简称为Master)。当然,两个相互通信的类可以互为Provider和Master。请注意,后面将出现Provider object和Master object,它们对应于是Provider和Master的实例。

Master从Provider获取所需信息主要有两种方式:正向获取和反向获取。每一种方式又有几种不同的实现方式。下面我将一一介绍。

 

二.正向获取信息

 

所谓“正向“获取信息,就是按照通常的直线思考方式来考虑,Master需要从Provider获取信息,就直接让Master访问Provider的某个成员。在这种方式下,Master处于主动地位,因为总是由它去主动拜访Provider,而Provider相对比较被动。

不出你所料,主要有以下几种方法。

1. Provider暴露一个成员变量或属性

 

Master 可以通过访问这个成员变量或属性得到所需数据。这种方法对于得到一些简单的非保密性信息是比较方便的,通常这些信息可以被Provider自己直接提供,并且不易发生变化,比如获取某个控件(当然是一个Provider object)的size或color等等。此方法的不利之处是,如果Provider所提供的数据是保密性的,那么这个安全性就得不到保证。

 

2. Provider暴露一个方法

 

如果所需的信息比较复杂(比如需要通过简单的计算才能得到),或经常处于变化之中,通过一个方法来提供这样的信息无疑是更好的选择。有两种实现方式:

(1)通过返回值

这个我们经常用,在这种情况下,Master还可以通过参数来和Provider进行更多的交流。如:

public Information GetInformation( 参数 ) ;

 

(2)通过ref或out参数

如果一个方法的返回值被用于其它目的,如判断方法是否执行成功等,此时可以用ref或out来将所需的信息从方法中“带出”。如:

public int GetInformation(out Information info) ;

 

 

或许你已经看出来了,正向获取信息的方式的主要问题在于,Master不知道Provider会于何时准备好所需的数据,也就是说,Master是在一个合适的时间拜访Provider吗?如果时机不恰当,显然就得不到正确的信息。

为了解决这个问题,我们可以采取反向获取信息的方式。

 

三.反向获取信息

所谓“反向”获取信息,就是Provider在准备好数据后,主动将数据提供给Master。与正向获取信息的方式相比较,可以看到,主――客关系发生了变化,现在是Provider主动去拜访Master。这就很自然地解决了正向获取信息方式的时机可能不成熟的问题。

在实际中,用的最多的就是反向获取信息的方式,普遍的情况是这样的:在Master需要数据时,创建一个Provider object,Provider object取得数据并作相关处理后将所需信息保存在一个Information object中,然后将该Information object提交给Master,自此该Provider object生命期结束,接着Master就可以处理得到的数据了。为了使读者有一个直观的认识,举个简陋的例子:

 

图1 Master

图2 Provider

1.通过类的静态成员变量数

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值