5.10 的具体实现。
清单 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); 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事件域成员。你可以观察到代表元作为一种新的类型声明,当声明事件时可以使用代表元。  
2/2 首页 上一页 1 2 |