C#开发ArcEngine的一点学习心得

原创 2006年05月21日 00:07:00

        当初csdn提供bolg的时候,我也凑热闹开通了一个,由于几年不做技术啦,一直也没开写。如今来到了新单位,居然又要开始做一些开发工作了,唉,想当年,俺用的是Vb6,开发了许多的GIS软件,那叫一个熟啊,现如今重操编程旧业,要用C#开发ArcEngine了,两个东东对我而言都是很新鲜的啊,学吧...

       突然想到我还有个csdn bolg,写写学习心得吧, 今天是我学C#的第3天,ArcEngine的第4天,觉得delegate和事件好费解,可开发ArcEngine又很常用,比如:

((ICustomizeDialogEvents_Event)m_CustomizeDialog).OnCloseDialog += new ICustomizeDialogEvents_OnCloseDialogEventHandler(this.OnCloseDialog);

于是对比着button的click事件琢磨了一下这句代码的含义,理解如下:

  (ICustomizeDialogEvents_Event)m_CustomizeDialog的作用是QI from ICustomDialog to ICustomizeDialogEvents_Event,对了C#里面习惯叫强制类型转换,QI(Query Interface)是AO里的叫法;然后就像.net frame的button类已经为开发者建立了(继承了)System.EventHandler这个delegate一样,ESRI.ArcGIS.ToolbarControl类也已经建立(应该是继承)了一个名为stomizeDialogEvents_OnCloseDialogEventHandler的delegate;同样的,.net frame的button类定义了button1.Click事件,这个事件其实是一个实例化的System.EventHandler(前面建立的delegate),ESRI.ArcGIS.ToolbarControl类也定义了ESRI.ArcGIS.ToolbarControl.ICustomizeDialogEvents_Event.OnCloseDialog事件;(不同之处在于这个事件定义在了ICustomizeDialogEvents_Event接口下),这个事件其实是一个实例化的ICustomizeDialogEvents_OnCloseDialogEventHandler(前面建立的delegate),.net frame的button类的button1.Click事件用法是自定义一个方法,然后在构造函数中调用该方法的多点delegate,ESRI.ArcGIS.ToolbarControl.ICustomizeDialogEvents_Event.OnCloseDialog事件的用法与此类似。

================================

事实上可以这样理解delegate和event,下面是C#高级编程中的一段例程,我加上了自己理解的注释:

事件服务器类负责定义delegate并创建一个event类型的delegate实力,这样事件处理器类可以通过这个delegate实例传递自己定义的方法。

事件服务器类:

using System;

namespace delegateSample
{

 public class UserInputMonitor  //事件服务器<或者叫事件发生器>类/对象(定义事件,发出事件通知的类)
 {                              //用于设置事件,相当于.net frame的一个特例(起到了类似的作用),.net frame相当于所有事件的发生器(服务器)
  public delegate void UserreQuest(object sender,UserRequestEventArgs e);//可以把委托看成是事件句柄,以及对事件的描述,包括参数和返回值
  public event UserreQuest OnUserRequest;//这里声明事件,事件是类/对象用于发出通知的成员,事件必须声明成delegate型的;同时这里实例化了一个对象

 
  public void Run()
  {
   while(true)
   {
    Console.WriteLine("Please Select the perper item:");
    Console.WriteLine("  Request AD--hit A to return;");
    Console.WriteLine("  Request personal message from ballake----" + "hit P to return;");
    Console.WriteLine("  Exit----hit X to return;");
    string response=Console.ReadLine();
    char responseChar=Convert.ToChar(response[0]);
    switch(responseChar)
    {
     case 'A':
      OnUserRequest(this,new UserRequestEventArgs(RequestType.ADRequest));
      break;
     case 'P':
      OnUserRequest(this,new UserRequestEventArgs(RequestType.PersonalMessageRequest));
      break;
     case 'X':
      return;
    }
   }
  }

 


 }
 public enum RequestType{ADRequest,PersonalMessageRequest};

 public class UserRequestEventArgs:EventArgs //定义事件参数的方法!!
 {
  public RequestType request;

  public UserRequestEventArgs(RequestType request):base()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
   this.request=request;
  }
  public RequestType Request
  {
   get
   {
    return request;
   }
  }

 }
}

  事件处理器类 :

using System;
using System.Windows.Forms;
namespace delegateSample
{
 public class MessageDisplayer//事件处理器类/对象(接受事件通知,并对事件作出相应处理)
 {
  public MessageDisplayer(UserInputMonitor monitor)
  {
   //button1....
   monitor.OnUserRequest+=new UserInputMonitor.UserreQuest(UserRequestHandler);
  }
  protected void UserRequestHandler(object sender,UserRequestEventArgs e)
  {
   switch(e.request)
   {
    case RequestType.ADRequest:
     Console.WriteLine("AD Information!");
     break;
    case RequestType.PersonalMessageRequest:
     Console.WriteLine("ballake personal's Information!");
     break;
   }
  }
 }
 public class ManagerStaffMonitor//事件处理器类/对象(接受事件通知,并对事件作出相应处理)
 {
  public ManagerStaffMonitor(UserInputMonitor monitor)
  {
   monitor.OnUserRequest+=new UserInputMonitor.UserreQuest(UserRequestHandler);
  }
  protected void UserRequestHandler(object sender,UserRequestEventArgs e)
  {
   if(e.request==RequestType.PersonalMessageRequest)
    MessageBox.Show("henhen","i am saying...");

  }
 }
 public class MainClass //主程序
 {
  public static void Main(string[] args)
  {
   UserInputMonitor inputmonitor=new UserInputMonitor();
   MessageDisplayer mdisplayer=new MessageDisplayer(inputmonitor);
   ManagerStaffMonitor msmonitor=new ManagerStaffMonitor(inputmonitor);
   inputmonitor.Run();

  }
 }

}

   

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android开发从零开始——进阶之路(分享一点学习心得)

Android 开发之 Activity         Activity ,英文意思是huo'do

[转载]关于文件系统和磁盘驱动的一点学习心得

原文地址:http://hi.baidu.com/weolar/blog/item/34a8ff19be316572dbb4bd4f.html 今天看到sudami同学问起这些东西,好久没搞了,很生疏...

关于java内存泄漏的一点学习心得

关于java内存泄漏的一点学习心得关于内存泄露的概念(官方解释): 内存泄漏也称作”存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓...

SQLite的一点学习心得

1.主键的设计原则: (1)主键应当对用户是没有意义的 (2)永远不要更新主键 (3)主键不应包含动态变化的数据 (4)主键应当由计算机自动生成 2. 创建表 CREATE TABLE if ...

关于C#中AutoResetEvent和ManualResetEvent的一点学习心得

C#中的AutoResetEvent和ManualResetEvent用于实现线程同步。其基本工作原理是多个线程持有同一个XXXResetEvent,在这个XXXResetEvent未被set前,各线...

mysql存储引擎的一点学习心得总结

首先我们应该了解mysql中的一个重要特性——插件式存储引擎,从名字就可以看出在mysql中,用户可以根据自己的需求任意的选择存储引擎,实际上也是这样,即使在同一个数据库中,不同的表也可以使用不同的存...

【分享】关于第10章-同时替换栈和.data中COOKIES来突破GS的一点学习心得

个人感觉从这一节真的学到了很多,比如如何在OD中寻找一些对应函数中指令的位置,如果查找某些寄存器的值等,下面将我的学习心得贴出来,内容完全由本人一字一句手敲出来,转载请注明出处。 主要是...

《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

I will Make Impossible To I'm possible                     -----------LittleHann   看了2个多星期。...

嵌入式Linux的一点学习心得

Linux本身是一个发展中的操作系统。它有很多前期不完善的机制,被后代用新的机制代替。但是老的机制不可能一下子就消亡,因此由于“历史原因”,会产生很多新旧机制共存的情况。而且Linux的教科书数不胜数...

OSGI 學習心得 Java 開發

  • 2010-11-17 23:01
  • 538KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)