2011-07-26 29 views
15

Xin lỗi vì đã hỏi tất cả, nhưng tôi là một tay Vb.net cũ đang chuyển sang C#. Tôi có đoạn mã sau dường như kích hoạt khi phương thức postAsync (trong trường hợp này) được kích hoạt. Tôi chỉ don; t hiểu những gì các mã đang làm (như sau): -+ = (o, arg) => thực sự đạt được điều gì?

app.PostCompleted += 
    (o, args) => 
    { 
     if (args.Error == null) 
     { 
      MessageBox.Show("Picture posted to wall successfully."); 
     } 
     else 
     { 
      MessageBox.Show(args.Error.Message); 
     } 
    }; 

nếu có ai có thể giải thích những gì + = (o, args) => thực sự là acheiving Tôi sẽ rất biết ơn .. ..

cảm ơn rất nhiều trước. Tim

Trả lời

26

(o,args) => xác định biểu thức lambda có hai tham số có tên oargs. Các loại thông số này được suy ra theo loại PostCompleted (nếu PostCompletedEventHandler, thì chúng sẽ tương ứng là loại ObjectEventArgs). Nội dung của biểu thức sau đó theo sau số =>.

Kết quả được thêm vào dưới dạng trình xử lý cho PostCompleted.

Như vậy, đó là một cách ít tiết để viết:

app.PostCompleted += delegate(object o, EventArgs args) 
{ 
    // ... 
}; 

Đó là một cách viết tắt cho:

void YourHandler(object o, EventArgs args) 
{ 
    // ... 
} 

// ... 

app.PostCompleted += YourHandler; 
+8

Đó là, chính nó, viết tắt cho 'app.PostCompleted + = new EventHandler (YourHandler);'. – Shibumi

+0

Bạn thậm chí không cần phải có "EventHandler mới". Trình biên dịch C# đủ thông minh để phỏng đoán người dùng nào sử dụng. Vì vậy, một lối tắt ngắn hơn là 'app.PostCompleted + = YourHandler;' – Sung

+4

@Sung Tôi nghĩ đó là chính xác những gì anh ta nói. –

8

Đó là trình xử lý bổ sung cho sự kiện PostCompleted bằng biểu thức lambda. Nó tương tự như

app.PostCompleted += MyHandler; 

    // ... 

    private void MyHandler(object sender, EventArgs e) { 
     // ... 
    } 

Nhưng khi sử dụng biểu thức lambda, bạn không thể tách bộ điều khiển dễ dàng.

5

Đó là viết tắt cho một đại biểu định xử lý sự kiện cho sự kiện hoàn thành POST:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ... 
}; 

Xem thêm Anonymous Methods.

3

Giả sử PostCompleted là một sự kiện, về cơ bản bạn đang tạo một trình xử lý sự kiện sử dụng ký pháp lambda.

Mã này snipped tương đương với:

app.PostCompleted += delegate (o, args) 
{ 
    if (args.Error == null) 
    { 
     MessageBox.Show("Picture posted to wall successfully."); 
    } 
    else 
    { 
     MessageBox.Show(args.Error.Message); 
    } 
}; 
2

Phần (o,args) => là một lambda expression, mà là một chức năng ẩn danh.

phần += gán biểu thức lambda được gọi khi sự kiện kích hoạt.

+0

Thnaks cho liên kết MSDN ..... –

3

Các vb.net tương đương sẽ trông như thế này:

AddHandler app.PostCompleted, Function(o, args) 
     ''# ... 
    End Function 

Lưu ý rằng điều này đòi hỏi Visual Studio 2010/Net 4, nhưng mã C# làm việc trở lại trong Visual Studio 2008/Net 3.5.

Nhưng điều đó chỉ đúng một phần. Trong C#, đây là một cách để định nghĩa một phương thức như một trình xử lý sự kiện ở một nơi. Trong VB.Net, bạn có thể sử dụng từ khóa Handles, và do đó tương đương với thực tế có thể trông như thế này:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted 
    ''# 
End Sub 

Nhưng ngay cả điều đó không hoàn toàn tương đương, vì bạn đã cho phương pháp này một tên và có thể gọi nó từ bất cứ đâu. Tham chiếu duy nhất đến mã C# (và do đó cách duy nhất để gọi nó) là thông qua đăng ký sự kiện.

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