2009-02-22 70 views
6

'=>' trong tuyên bố này có ý nghĩa gì?Toán tử '=>' có nghĩa là gì trong C#?

del = new SomeDelegate(() => SomeAction()); 

Tuyên bố trên có giống như tuyên bố này không?

del = new SomeDelegate(this.SomeAction); 

Cảm ơn.

+0

Bạn nên sử dụng tiêu đề mô tả hơn cho câu hỏi của mình, chẳng hạn như "Toán tử '=>' có nghĩa gì trong C#?" thay vì "C# câu hỏi đại biểu" –

+0

Cảm ơn, tôi sẽ cố gắng mô tả hơn. – Krakerjak

Trả lời

7

Về cơ bản, nó chỉ định một hàm ẩn danh, không có tham số nào gọi là SomeAction. Vì vậy, có, chúng có chức năng tương đương. Mặc dù không bằng nhau. Sử dụng lambda là tương đương hơn:

del = new SomeDelegate(this.CallSomeAction); 

nơi CallSomeAction được định nghĩa là:

public void CallSomeAction() 
{ 
    this.SomeAction(); 
} 

Hy vọng rằng sẽ giúp!

+0

Vì vậy, sau đó '=>' biểu thị lambda? Điều gì sẽ là lợi thế của một trong những khác? – Krakerjak

+1

Lợi thế chủ yếu là một trong những tính ngắn gọn và dễ đọc :) – mletterle

4

Họ làm điều tương tự nhưng cú pháp "() => ..." được gọi là biểu thức lambda và như vậy cũng giống như một hàm ẩn danh. Bạn có lẽ có thể rời khỏi phần đại biểu hoàn toàn và chỉ để trình biên dịch suy ra loại ủy nhiệm cho bạn.

del = this.SomeAction; 

Tùy thuộc vào loại "del" được giữ bí mật.

Sửa

Sử dụng lambdas hoặc các phương pháp vô danh hay chỉ là một phương pháp thông thường cho người mới bắt đầu cho phép bạn để lập bản đồ các phương pháp mà không có chữ ký của người đại biểu để các đại biểu.

Ví dụ: giả sử bạn có đại biểu có chữ ký bool myDelegate (int, int) nhưng bạn muốn có phương thức có chữ ký bool myMethod (chuỗi, chuỗi) xử lý ủy nhiệm. Sau đó bạn có thể sử dụng biểu thức lambda để cho phép bạn làm điều này với một cú pháp ngắn như vậy.

delegate bool myDelegate(int x, int y); 

// With lambdas... 
myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString()); 

// With anonymous methods... 
myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); }; 

// The good ol' way without lambdas or anonymous methods... 
myDelegate del3 = SomeDelegateHandler; 

... then write a method somewhere else ... 

// Handler method 
private bool SomeDelegateHandler(int a, int b) 
{ 
    return myMethod(a.ToString(), b.ToString()); 
} 

Vì vậy, bạn có thể thấy lambdas và các phương pháp ẩn danh về cơ bản chỉ là cách làm ngắn hơn/nội tuyến để xử lý đại biểu. Trong trường hợp bạn có thể không cần phải thực hiện thêm một phương pháp. Nó chỉ phụ thuộc vào nếu chữ ký của người được ủy quyền giống như chữ ký của phương thức của bạn, và với tôi, nó có vẻ giống như vậy.

2

=>Lambda Operator, biểu thức lambda giống như sự tiến hóa của C# 2.0 anonymous methods.

Bạn có thể sử dụng phương pháp vô danh và biểu thức lambda trong một cách rất giống với tạo trường hợp đại biểu:

Func<string,int> wordCount; 
wordCount = delegate (string text) { return text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 

Sử dụng biểu thức lambda:

Func<string,int> wordCount; 
wordCount = (string text) => { text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 
4

Các "=>" có thể được đọc "đi thành "(source: Eric Lippert) và chỉ cần tách (các) đối số khỏi hoạt động trong biểu thức lambda. Trong trường hợp này, một lambda là quá mức cần thiết.ví dụ tốt hơn sẽ là:

var subList = list.FindAll(item => item.Type == "Foo"); 

(tìm tất cả các mục trong đó type của item là Foo)

, vv Trong C# 2.0, điều này cũng có thể được viết:

var subList = list.FindAll(delegate(SomeType item) { 
    return item.Type == "Foo";}); 

Và là một cách nhanh chóng cách biểu hiện hàm "nội tuyến", đồng thời cũng cung cấp hỗ trợ "đóng cửa" - nghĩa là nó cũng có thể là:

string itemType = ... 
var subList = list.FindAll(item => item.Type == itemType); 

To làm được điều này nếu không sẽ đòi hỏi một loại-definiton để vượt qua trong mục-type:

class Searcher { 
    public string itemType; 
    public bool Find(SomeType item) {return item.Type == itemType;} 
} 
... 
Searcher searcher = new Searcher(); 
searcher.itemType = ... 
var subList = list.FindAll(searcher.Find); 

Trong thực tế, điều này là khá-nhiều chính xác những gì các trình biên dịch làm cho chúng ta (cả cho "đại biểu" và sử dụng lambda). Sự khác biệt lớn nhất là một lambda có thể cũng thể hiện một số Expression, ví dụ như cho LINQ.

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