在.NET中利用委托实现窗体间安全通信

在.NET中利用委托实现窗体间安全通信

大家好,又见面了,我是全栈君。


 

对于窗体间简单的通信,采用VB6.0的方法就能满足我们的要求,但在一些架构设计复杂的应用中,这种方法就显得有点捉襟见肘了,同时该方法还有一个缺点,就是它仅仅对通过.NET窗体向导添加进去的窗体起作用,而对于自定义的窗体类型我们是无法添加到Forms对象集合中的。而且也和其它诸如构造函数传参等方法一样,会在窗体间大量互相引用各自的成员,造成了彼此之间存在着很大的耦合性,非常不利于窗体模块间的独立,这不符合良好软件设计模式的思想。


如果我们想在一个窗体中访问另一个窗体中自定义的成员,必须把该成员的可见性设置为Public或者通过属性公开,通过属性公开的话还说得过去,但如果把可见性设置成Public的,这样做就无可避免的破坏了类型封装性的原则,而这一做法也是我们在.NET下开发相当乐意做的,特别是对于初次接触.NET的开发人员,实现访问另一类型中成员的话最先想到的就是把该成员的可见性设置为Public,当然这样做算不上是错误,但把这一做法作为自己的首要灵感,至少从面向对象的角度出发显然是不合适的。


在.NET下,还为我们提供了另外一种强大的机制来实现窗体通信,这就是委托。委托可理解为一种类型安全的函数指针,.NET下的事件的实现都是以委托做为基础的。关于委托在这篇文章中我就不详细介绍了,后边会有文章专门介绍这一概念。 在此我演示通过在一个窗体里向另外一个窗体里的ListBox控件添加Item项来说明这一方法。因此需要两个窗体,一个MainFrm窗体,一个ChildFrm窗体,另外还需要一个Middle类,作为MainFrm和ChildFrm之间通信的桥梁。我给出C#语言的代码,大家可以参考一下。 


首先是MainFrm窗体,在MainFrm窗体中,拖一个ListBox控件即可,MainFrm.cs的代码如下:


下面是对应的C#代码,MainFrm.cs:


public partial class MainFrm: Form


{



  private void MainFrm _Load(object sender, EventArgs e)


  {



    Middle.sendEvent += new Middle.SendMessage(this.DoMethod);


  }


  public void DoMethod(string getstr)


  {



    lsMain.Items.Add(getstr);


  }


}


ChildFrm.cs:


public partial class ChildFrm: Form


{



  public ChildFrm ()


  {



    InitializeComponent();


  } 


  private void btnAdd_Click(object sender, EventArgs e)


  {



    Middle.DoSendMessage(this.textBox1.Text);


    txtItem.Text = “”;


    txtItem.Focus();


  }


}


Middle.cs:


public static class Middle


{



  public delegate void SendMessage(string str);


  public static event SendMessage sendEvent;


  public static void DoSendMessage(string str)


  {



    sendEvent(str);


  }





同样我们修改一下Program.cs的代码:


static class Program


{



  [STAThread]


  static void Main()


  {



    Application.EnableVisualStyles();


    Application.SetCompatibleTextRenderingDefault(false);


    childFrm child = new childFrm();


    child.Show();


    Application.Run(new mainFrm());


  }


}


根据以上代码我们可以看出:C#则必须由我们自己首先声明事件的委托原型,然后再基于该委托声明事件,从这点看来VB.NET显得更简洁,其实VB.NET编译器在背后会自动的为我们定义一个委托对象,而且该委托与C#代码声明的委托所生成IL代码是一样的,这点大家可以通过Ildasm中间代码查看器来查看一下。引发事件,VB.NET是通过RaiseEvent关键字加上事件名称,而C#则是通过直接使用事件名称;最后是绑定事件的代码,VB.NET是通过AddHandler关键字,C#通过重载的+=操作符,对于以上两点,编译器同样会为我们生成一致的IL代码。


当然,上面的例子比较简单,不过我们完全可以通过委托实现复杂的窗体通信,比如可以传递复杂的数据类型,同时,可以在设计结构更加良好的中间通信类。但也要提醒大家,不要动不动就要用委托,它会增加程序的复杂性,应该根据自己的需求考虑用何种方法。

转:http://www.isabout.net/article.asp?id=215



本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/sgsoft/archive/2007/05/23/757726.html,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108044.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • plsql13连接oracle配置_plsql developer配置数据库连接

    plsql13连接oracle配置_plsql developer配置数据库连接由于硬件技术的不断更新,Win7系统逐渐成为主流,而且计算机内存逐渐增大,为了充分的利用内存资源(因为32为系统最多只能用到3G左右的内存),提高系统性能,很多人开始使用Win7(64Bit)的系统。在64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQLDeveloper,此时就不能使用PL/SQLDeveloper来进行直接连接的,所以要想实现连接还得需要其他途径来完

    2022年10月12日
    2
  • 静态路由(静态汇总路由,静态默认路由,负载均衡,浮动静态路由)介绍

    静态路由(静态汇总路由,静态默认路由,负载均衡,浮动静态路由)介绍网络上通过硬件设备传递数据。最常见的就是路由器和交换机。本篇介绍路由器如何使用静态路由条目来转发数据。一个数据包从源IP地址到目标IP地址间可能穿过多个路由器,也可能有多条路径通往目标IP地址。那路由器收到数据后,如何知道哪个端口能通往目标地址呢?如果多个端口都可通往目标地址,又如何选择用哪个端口转发才是最优路径呢?依据的就是路由表。路由表就是路由器的灵魂

    2022年9月25日
    4
  • eclipse代码中文乱码解决方法

    eclipse代码中文乱码解决方法eclipse代码中文乱码解决方法:窗口→首选项→常规→工作空间→文本文件编码→其他UTF-8

    2022年5月11日
    45
  • java divide_java中awt做什么的

    java divide_java中awt做什么的gridx,gridy:设置组件的位置,从0开始gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出gridx,gri…

    2025年9月1日
    4
  • linux版本i686,在Ubuntu中’i686’是什么意思? – Ubuntu问答

    linux版本i686,在Ubuntu中’i686’是什么意思? – Ubuntu问答问题描述检查我是使用32位还是64位Ubuntu。我查看了如何检查我是否拥有32位或64位操作系统?,发现此答案为uname-a。如果它显示为i386,它将是32位和amd64,它将是64位,但我得到了这个结果:Linuxmukund-ThinkPad-Edge-E4313.8.0-35-generic#50-UbuntuSMPTueDec301:25:33UTC2013i…

    2022年6月7日
    39
  • Linux系统安装Python3环境(超详细)

    Linux系统安装Python3环境(超详细)本文基于如下Linux系统版本:1、默认情况下,Linux会自带安装Python,可以运行python–version命令查看,如图:我们看到Linux中已经自带了Python2.7.5。再次运行python命令后就可以使用python命令窗口了(Ctrl+D退出python命令窗口)。2、查看Linux默认安装的Python位置看到/usr/bin/python…

    2022年5月26日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号