各版本.NET委托的写法回顾
http://www.csharpwin.com/csharpspace/7548r2766.shtml
在《关于最近面试的一点感想》一文中,Michael同学谈到他在面试时询问对方“delegate在.net framework1.1,2.0,3.5各可以怎么写”这个问题。于是乎,有朋友回复道“请问楼主,茴香豆的茴有几种写法”,“当代孔乙己”,独乐,众 乐。看了所有的评论,除了某些朋友认为“的确不该不知道这个问题”之外,似乎没有什么人在明确支持楼主。
不过我支持,为什么?因为我也提过出这样的问题:各版本.NET委托的写法有何不同?
这样,我们暂且不提应聘“高级开发人员”的人,在“自称熟悉各版本.NET框架”的前提下,是否应该知道这个答案。我们也暂且不提Michael同学提问的“目的”是什么。老赵就先单独针对这个问题进行解释,然后谈谈自己为什么会提出这个问题吧。
可能有一件事情需要说在前面,那就是:委托本身其实从来没有改变过,改变的一直都是委托的“写法”。因此更确切地说,改变的只是“编译器”。而本文所有内 容都用C#来实现,其实谈得也都是C#编译器本身——但是其实VB.NET也有变化埃再由于.NET版本和C#版本的关系也是非常密切的,因此全文就使 用.NET版本进行指代了。
.NET 1.x中委托的写法
委托,如果不追究细节,从表面上来看我们可以将其通俗地理解为一个安全的“函数指针”。当然,这个函数指针其实也是一个对象,有自己的成员,也会封装了被调用方的上下文等等。至于委托的定义和使用方式,则是这样的:
- public delegate int SomeDelegate(string arg1, bool arg2);
- public static int SomeMethod(string arg1, bool arg2) { return 0; }
- public class SomeClass
- {
- public int SomeMethod(string a1, bool a2) { return 0; }
- public event SomeDelegate SomeEvent;
- }
- static void Main(string[] args)
- {
- SomeClass someClass = new SomeClass();
- SomeDelegate someDelegate = new SomeDelegate(someClass.SomeMethod);
- someClass.SomeEvent += new SomeDelegate(SomeMethod);
- }
- public delegate TResult MyFunc(T1 a1, T2 a2);
- public static int SomeMethod(string a1, bool a2) { return 0; }
- static void Main(string[] args)
- {
- MyFunc<string, bool, int> myFunc = SomeMethod;
- }
- public static void TestRequest(string url)
- {
- WebRequest request = HttpWebRequest.Create(url);
- request.BeginGetResponse(delegate(IAsyncResult ar)
- {
- using (WebResponse response = request.EndGetResponse(ar))
- {
- Console.WriteLine("{0}: {1}", url, response.ContentLength);
- }
- },
- null);
- }
- public static void TestRequest(string url)
- {
- WebRequest request = HttpWebRequest.Create(url);
- object[] context = new object[] { url, request };
- request.BeginGetResponse(TestAsyncCallback, context);
- }
- public static void TestAsyncCallback(IAsyncResult ar)
- {
- object[] context = (object[])ar.AsyncState;
- string url = (string)context[0];
- WebRequest request = (WebRequest)context[1];
- using (WebResponse response = request.EndGetResponse(ar))
- {
- Console.WriteLine("{0}: {1}", url, response.ContentLength);
- }
- }
- public static void TestRequest(string url)
- {
- WebRequest request = HttpWebRequest.Create(url);
- request.BeginGetResponse(delegate(IAsyncResult ar)
- {
- TestAsyncCallback(ar, request, url);
- }, null);
- }
- public static void TestAsyncCallback(IAsyncResult ar, WebRequest request, string url)
- {
- using (WebResponse response = request.EndGetResponse(ar))
- {
- Console.WriteLine("{0}: {1}", url, response.ContentLength);
- }
- }
- public static void TestRequest(string url)
- {
- WebRequest request = HttpWebRequest.Create(url);
- request.BeginGetResponse(ar => TestAsyncCallback(ar, request, url), null);
- }