首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

展现C#世界之五:类的介绍

  清单 5.10 通过一个索引获取一个IP地址

  1: using System;

  2: using System.Net

  3:

  4: class ResolveDNS

  5: {

  6: IPAddress[] m_arrIPs;

  7:

  8: public void Resolve(string strHost)

  9: {

  10: IPHostEntry iphe = DNS.GetHostByName(strHost);

  11: m_arrIPs = iphe.AddressList;

  12: }

  13:

  14: public IPAddress this[int nIndex]

  15: {

  16: get

  17: {

  18: return m_arrIPs[nIndex];

  19: }

  20: }

  21:

  22: public int Count

  23: {

  24: get { return m_arrIPs.Length; }

  25: }

  26: }

  27:

  28: class DNSResolverApp

  29: {

  30: public static void Main()

  31: {

  32: ResolveDNS myDNSResolver = new ResolveDNS();

  33: myDNSResolver.Resolve("http://www.microsoft.com");

  34:

  35: int nCount = myDNSResolver.Count;

  36: Console.WriteLine("Found {0} IP's for hostname", nCount);

  37: for (int i=0; i < nCount; i++)

  38: Console.WriteLine(myDNSResolver[i]);

  39: }

  40: }

  为了解析主机名,我用到了DNS类,它是System .Net 名字空间的一部分。但是,由于这个名字空间并不包含在核心库中,所以必须在编译命令行中引用该库:

  csc /r:System.Net.dll /out:resolver.exe dnsresolve.cs

  解析代码是向前解析的。在该 Resolve方法中,代码调用DNS类的静态方GetHostByName,它返回一个IPHostEntry

  对象。结果,该对象包含有我要找的数组——AddressList数组。在退出Resolve 方法之前,在局部的对象实例成员m_arrIPs中,存储了一个AddressList array的拷贝(类型IPAddress 的对象存储在其中)。具有现在生成的数组 ,通过使用在类ResolveDNS中求得的索引,应用程序代码就可以在第37至38行列举出IP地址。

  (在第6章 "控制语句",有更多有关语句的信息。) 因为没有办法更改IP地址,所以仅给索引使用了get存取标志。为了简单其见,我忽略了数组的边界溢出检查。

  5.4 事件

  当你写一个类时,有时有必要让类的客户知道一些已经发生的事件。如果你是一个具有多年编程经验的程序员,似乎有很多的解决办法,包括用于回调的函数指针和用于ActiveX控件的事件接收(event sinks)。现在你将要学到另外一种把客户代码关联到类通知的办法——使用事件。

  事件既可以被声明为类域成员(成员变量),也可以被声明为属性。两者的共性为,事件的类型必定是代表元,而函数指针原形和C#的代表元具有相同的含义。

  每一个事件都可以被0或更多的客户占用,且客户可以随时关联或取消事件。你可以以静态或者以实例方法定义代表元,而后者很受C++程序员的欢迎。

  既然我已经提到了事件的所有功能及相应的代表元,请看清单5.11中的例子。它生动地体现了该理论。

  清单5.11 在类中实现事件处理

  1: using System;

  2:

  3: // 向前声明

  4: public delegate void EventHandler(string strText);

  5:

  6: class EventSource

  7: {

  8: public event EventHandler TextOut;

  9:

  10: public void TriggerEvent()

  11: {

  12: if (null != TextOut) TextOut("Event triggered");

  13: }

  14: }

  15:

  16: class TestApp

  17: {

  18: public static void Main()

  19: {

  20: EventSource evsrc = new EventSource();

  21:

  22: evsrc.TextOut += new EventHandler(CatchEvent);

  23: evsrc.TriggerEvent();

  24:

  25: evsrc.TextOut -= new EventHandler(CatchEvent);

  26: evsrc.TriggerEvent();

  27:

  28: TestApp theApp = new TestApp();

  29: evsrc.TextOut += new EventHandler(theApp.InstanceCatch);

  30: evsrc.TriggerEvent();

  31: }

  32:

  33: public static void CatchEvent(string strText)

  34: {

  35: Console.WriteLine(strText);

  36: }

  37:

  38: public void InstanceCatch(string strText)

  39: {

  40: Console.WriteLine("Instance " + strText);

  41: }

  42: }

  第4行声明了代表元(事件方法原形),它用来给第8行中的EventSource类声明TextOut事件域成员。你可以观察到代表元作为一种新的类型声明,当声明事件时可以使用代表元。

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航