在.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)
上一篇 2022年3月8日 下午12:00
下一篇 2022年3月8日 下午12:00


相关推荐

  • java程序 水仙花数_Java小程序之水仙花数

    java程序 水仙花数_Java小程序之水仙花数水仙花数 实验目的 1 掌握 Java 程序的编译过程 以及 Java 程序面向对象的编写方法 2 掌握类的定义与声明 3 掌握对象的使用与创建 4 掌握构造方法的格式及使用 5 理解并熟练运用 ifelse 语句实现程序所要求的条件 实验原理 1 依次对一个三位数的每一位数的平方求和 百位数可通过除 100 取整得到 十位数可通过除 10 取整得到 2 三位数中的最小数是 101 最大数是 999 所以水仙花数必然存在于 101

    2026年3月18日
    2
  • SQLServer2008安装教程[通俗易懂]

    SQLServer2008安装教程[通俗易懂]因为对接老系统的数据,上面使用的SQLServer2008,所以本机也需要SQLServer2008作对接。首当其冲的就是SQLServer2008的安装。1.下载sqlServer2008的安装包2.在安装包中点击setup.exe2.选择安装,再选择全新安装3.安装规则检测,等待通过后确认4.产品密钥会自动填充直接下一步(不截图说明)5.勾选“我接受”直接下一步(不截图说明)6.对于程序支持文件,点击安装;然后安装通过,点击下一步7.设置角色,选择“功..

    2022年6月23日
    43
  • Zookeeper windows安装

    Zookeeper windows安装百度网盘链接提取码:yg12拷贝zoo.cfg更改日志输出路径新建文件夹启动成功

    2022年8月9日
    8
  • blender2.9教程_赖世雄入门篇

    blender2.9教程_赖世雄入门篇Blender2.8基础(一)基础操作与常用快捷键▶Ctrl+N:创建新工程一、视图操作1、放大视图▶视图最大化显示:Ctrl+空格(左键点击视图任意地方可以选择视图,然后按Ctrl+空格可以最大化显示视图。)▶切换全屏模式:Ctrl+Alt+空格2、切换视图▶切换视图:Alt(按住不放)+按住中键上下或左右移动鼠标(每切换一次视图就必须重新按一下中键并移动鼠标)▶……

    2022年8月10日
    10
  • iptables 常用命令

    iptables 常用命令

    2022年3月8日
    48
  • java如果智慧小区物业系统,基于ssm\springboot智慧小区物业管理平台实现

    java如果智慧小区物业系统,基于ssm\springboot智慧小区物业管理平台实现手把手实现智慧小区物业平台

    2022年10月17日
    2

发表回复

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

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