2010-09-20 33 views
6

C# đại biểu luôn luôn là khó khăn cho tôi để nắm bắt và vì vậy tôi đã rất vui khi vấp ngã trên logicchild's article on The Code Project web site titled "C# Delegates: Step by Step". Ông có một cách rất ngắn gọn giải thích C# đại biểu và tôi có thể giới thiệu nó cho bạn. Tuy nhiên, trong thử các ví dụ, tôi thấy rằng hai cách để khởi tạo một đại biểu, chủ yếu là:Cách "chính xác" để khởi tạo đại biểu C# là gì?

//create a new instance of the delegate class 
    CalculationHandler sumHandler1 = new CalculationHandler(math.Sum); 
    //invoke the delegate 
    int result = sumHandler1(8, 9); 
    Console.WriteLine("Result 1 is: " + result); 

CalculationHandler sumHandler2 = math.Sum; 
    //invoke the delegate 
    int result = sumHandler2(8, 9); 
    Console.WriteLine("Result 2 is: " + result); 

nơi lớp toán được định nghĩa là

public class Math 
{ 
    public int Sum(int x, int y) 
    { 
     return x + y; 
    } 
} 

Vì vậy, đó là cách "chính xác" và tại sao?

Trả lời

7

Cả hai đều chính xác, nhưng method group conversion, là tùy chọn thứ hai được thêm vào 2.0 (IIRC). I E. nếu bạn đang sử dụng phiên bản cũ của trình biên dịch, bạn cần sử dụng tùy chọn đầu tiên. Nếu không, việc gõ thêm là thực sự dư thừa.

3

Tôi luôn sử dụng phương pháp đầu tiên để dễ đọc. Tùy chọn thứ hai làm cho nó xuất hiện là math.Sum là một thuộc tính và trả về kết quả là một CalculationHandler. Cá nhân, tôi nghĩ rằng đó là khó hiểu.

+6

Whoa. Rất nhiều tội phạm được cam kết "Vì lợi ích của khả năng đọc", và nổi bật trong số đó là viết mã dài, phức tạp thay vì mã rõ ràng, súc tích. Điều đó ngược lại với khả năng đọc. –

+0

vui vẻ Tôi sử dụng thứ hai để dễ đọc. Chỉ cần đi để cho thấy rằng khả năng đọc là chủ quan –

+1

@Konrad, dài không tự động bằng cách phức tạp. Và ngắn không tự động có thể đọc được. RegEx đến với tâm trí ... Thực tế là cách "dài hơn" chặt chẽ hơn theo cách mọi thứ khác hoạt động trong C#. Cách ngắn hơn có khả năng gây nhầm lẫn. Tôi rất khó gọi CalculationHandler sumHandler1 = new CalculationHandler (math.Sum); một tội ác. – colithium

0

Cả hai cách đều OK, phiên bản ngắn chỉ là dịch vụ trình biên dịch C#. Cách đầu tiên là chi tiết hơn và cho thấy chính xác những gì sẽ xảy ra. Cả hai phiên bản đều sản xuất cùng mã IL, thực sự gần với phiên bản đầu tiên.

1

Cả hai đều chính xác.

Cách thứ hai là một phím tắt được trình biên dịch cung cấp, cả hai đều thực sự tạo mã của mã đầu tiên.

Điều đầu tiên cho thấy rõ hơn điều gì đang thực sự xảy ra, trong khi mã thứ hai ít mã hơn để đọc dễ dàng hơn (khi bạn hiểu điều gì đang thực sự xảy ra).

1

Cá nhân tôi thích tùy chọn thứ hai (chuyển đổi nhóm phương pháp). Từ một quan điểm chức năng, tôi không quan tâm đến loại đại biểu, vì điều đó sẽ không cho tôi bất kỳ gợi ý nào về phương thức được gán cho đại biểu đang thực hiện khi được gọi. Tên phương thức sẽ (ít nhất là nên) tuy nhiên cho tôi một ý tưởng tốt về những gì sẽ xảy ra khi đại biểu được gọi và trong tùy chọn thứ hai tôi không phải tìm kiếm tên phương thức.

Một lưu ý phụ VS sẽ cung cấp cho bạn phiên bản đầu tiên nếu bạn sử dụng tự động hoàn tất với đăng ký trình xử lý sự kiện. Resharper sẽ sử dụng phần thứ hai và đánh dấu của mã trong phiên bản đầu tiên là dự phòng.

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