2009-12-27 43 views
5

Tôi đã chơi với HttpWebRequest s thời gian gần đây, và trong hướng dẫn họ luôn luôn làm:C# [đại biểu] mới không cần thiết?

IAsyncResult result = request.BeginGetResponse(
    new AsyncCallback(UpdateItem),state); 

Nhưng new AsyncCallback dường như không phải là cần thiết. Nếu UpdateItem có chữ ký phù hợp thì có vẻ như không có vấn đề gì. Vậy tại sao mọi người lại bao gồm nó? Nó có làm gì không?

+0

Tôi thường không sử dụng 'mới DelegateType (...)', cũng muốn biết nếu điều đó làm bất cứ điều gì. MSDN không thực sự nói về nó ở đây: http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx –

+0

bản sao có thể có của [C#: Sự khác biệt giữa '+ = anEvent' và '+ = new EventHandler (anEvent)'] (http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal

Trả lời

12

Điều tương tự, chủ yếu là (có một vài quy tắc quá tải để suy nghĩ, mặc dù không có trong ví dụ đơn giản này). Nhưng trong các phiên bản trước của C#, không có bất kỳ suy luận kiểu đại biểu nào. Vì vậy, các hướng dẫn hoặc là (a) được viết trước khi suy luận loại đại biểu đã có sẵn, hoặc (b) họ muốn được tiết cho mục đích giải thích.

Dưới đây là một bản tóm tắt của một vài trong số các cách khác nhau mà bạn có thể tận dụng lợi thế của đại biểu kiểu suy luận:

// Old-school style. 
Chef(new CookingInstructions(MakeThreeCourseMeal)); 

// Explicitly make an anonymous delegate. 
Chef(delegate { MakeThreeCourseMeal }); 

// Implicitly make an anonymous delegate. 
Chef(MakeThreeCourseMeal); 

// Lambda. 
Chef(() => MakeThreeCourseMeal()); 

// Lambda with explicit block. 
Chef(() => { AssembleIngredients(); MakeThreeCourseMeal(); AnnounceDinnerServed(); }); 
2

AsyncCallback chỉ là một đại biểu trong C#, nó được khai báo là

public delegate void AsyncCallback(IAsyncResult ar); 

Khi bạn vượt qua các tên phương pháp riêng của mình miễn là chữ ký phù hợp với trình biên dịch thường sẽ thay thế mã cho bạn, chỉ cần tắt nó.

Bạn chỉ cần kiểm tra điều này bằng cách sử dụng Reflector. Nếu bạn có ví dụ này.

request.BeginGetResponse(TestMethod, null); 

static void (IAsyncResult r) 
     { 
      //do something 
     } 

Mã được biên dịch sẽ thực sự trông như thế này.

request.BeginGetResponse(new AsyncCallback(Test), null); 
2

Để hoàn chỉnh, điều này thay đổi giữa C# 1.2 (với .NET 1.1) và C# 2.0 (với. NET 2.0). Vì vậy, từ 2.0 trở đi bạn thực sự có thể bỏ qua các new SomeDelegateType(...) trong hầu hết các kịch bản. Thật kỳ lạ, công cụ không thay đổi, vì vậy trong IDE nếu bạn nhập someObj.SomeEvent += IDE sẽ đề xuất (thông qua tabtab) phiên bản đầy đủ bao gồm loại đại biểu.

Các vấn đề liên quan