2009-11-17 26 views
16

Giống như các Phương thức ẩn danh, các đại biểu mà tôi đang khai báo sử dụng từ khóa "đại biểu" là các đại biểu ẩn danh?C# - Người được ủy quyền vô danh

namespace Test 
{ 
    public delegate void MyDelegate(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DelegateTest tst = new DelegateTest(); 
      tst.Chaining(); 
      Console.ReadKey(true); 
     } 
    } 

    class DelegateTest 
    { 
     public event MyDelegate del; 

     public void Chaining() 
     { 
      del += delegate { Console.WriteLine("Hello World"); }; 
      del += delegate { Console.WriteLine("Good Things"); }; 
      del += delegate { Console.WriteLine("Wonderful World"); }; 
      del(); 
     } 
    } 
} 

Trả lời

19

Bộ sưu tập đại biểu của bạn trong ví dụ trỏ đến một số phương pháp ẩn danh. Một đại biểu là "chỉ là một con trỏ phương pháp". Nó không quan trọng nếu nó trỏ đến một phương pháp thực hoặc một phương pháp vô danh.

Vui lòng xem http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

2

Có. Các đại biểu vô danh không thể được gọi trực tiếp theo tên, do đó, sử dụng cú pháp delegate(){} có nghĩa là họ ẩn danh.

1

Chúng là đại biểu cho các phương pháp ẩn danh. Đây là một cách để tạo các phương thức nặc danh, có sẵn từ .NET 2.0. Với .NET 3.0, bạn cũng có thể sử dụng các biểu thức lambda đơn giản hơn để viết (nhưng biên dịch thành cùng một mã). Tôi cho rằng đó là những gì bạn có nghĩa là với "phương pháp nặc danh". Nhưng thực sự, chúng là một và giống nhau.

+0

Biểu thức Lambda và các phương thức ẩn danh trong cú pháp lambda không thực sự giống nhau. Câu lệnh của bạn là đúng nếu bạn sử dụng cú pháp lambda với các dấu ngoặc nhọn: (x) => {y();} – Lucero

4

Đúng vậy, bạn đã gán một số phương thức ẩn danh cho một sự kiện.

Nếu bạn đang sử dụng phiên bản mới hơn của C#, bạn cũng có thể làm điều gì đó tương tự với lambdas. ví dụ:

class DelegateTest 
{ 
    public event Action del; 

    public void Chaining() 
    { 
     del +=() => Console.WriteLine("Hello World"); 
     del +=() => Console.WriteLine("Good Things"); 
     del +=() => Console.WriteLine("Wonderful World"); 
     del(); 
    } 
} 
+2

Bạn có nghĩa là C# 3.0 không? – user160677

23

Không có điều gì như "đại biểu ẩn danh" (hay đúng hơn, đó không phải là thuật ngữ được công nhận trong đặc tả C# hoặc bất kỳ thông số kỹ thuật nào khác liên quan đến .NET mà tôi biết).

Có các hàm ẩn danh bao gồm các phương thức ẩn danh và biểu thức lambda.

Mã của bạn hiển thị các phương thức ẩn danh cũ thuần túy - mặc dù chúng sử dụng một biểu thức lambda tính năng không có: khả năng không thể hiện thông số khi bạn không quan tâm đến chúng.

+0

Umm. bạn có thể làm rõ về điều này .. chúng ta thường thấy "Anonymous Delegates" hạn sử dụng mọi nơi cũng có thuật ngữ "Anonymous Methods" như được sử dụng trong MSDN, vì vậy chúng ta sai khi nói rằng cả hai hoặc cả hai đều đúng .. –

+0

@Shekhar_Pro: "Anonymous phương pháp "là chính xác. "Đại biểu ẩn danh" không chính xác. Bạn nói rằng bạn "thường thấy [nó] mọi nơi" - bạn có thể trích dẫn những địa điểm cụ thể không? –

+0

Không có trong bất kỳ tài liệu chính thức nào nhưng thuật ngữ thông thường được sử dụng bởi cư dân mạng. Giống như ... SO chính nó .. http://stackoverflow.com/search?q=anonymous+delegate .... vì vậy có vẻ như chúng tôi đã đi vào thói quen sử dụng sai hạn. –

2

Đại biểu của bạn không ẩn danh. Nó được gọi là MyDelegate. Đại biểu trong CLR là một lớp có nguồn gốc từ System.MulticastDelegate và trong trường hợp của bạn, nó được gọi là MyDelegate. Bạn không thể lấy trực tiếp từ MulticastDelegate, trình biên dịch C# sẽ dừng bạn.

Trong mã của bạn khi bạn gán đại biểu cho del, loại/tên của đại biểu được suy ra bởi trình biên dịch vì bạn khai báo del là sự kiện kiểu MyDelegate.

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