2010-02-02 22 views
9

Tôi có một câu hỏi đơn giản: lợi thế của việc khởi tạo một đại biểu C# như trái ngược với việc chuyển tham chiếu hàm là gì? Những gì tôi có nghĩa là:C# Phác thảo phân bổ so với chỉ cần truyền tham chiếu phương thức

Tại sao:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

Khi bạn có thể làm:

Thread t = new Thread(SomeObject.SomeMethod); 

Cả hai sẽ biên dịch và làm việc trong kinh nghiệm của tôi ... tôi thiếu cái gì?

+0

có thể trùng lặp của [Sự khác biệt giữa Hành động mới() và lambda là gì?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

Trả lời

6

Miễn là nhóm phương pháp SomeObject.SomeMethod có phương thức trả về void và không có tham số nào thì không có sự khác biệt. Điều này là do ThreadStart được định nghĩa là delegate trả về void và không có tham số và do đó có chuyển đổi tiềm ẩn từ nhóm phương pháp SomeObject.SomeMethod thành ThreadStart. Do đó, cả hai đều gọi quá tải Thread(ThreadStart) của hàm tạo Thread.

Phần có liên quan của đặc tả ngôn ngữ là §6.6 (Chuyển đổi nhóm phương pháp).

Tôi có một câu hỏi đơn giản: lợi thế của việc khởi tạo đại biểu C# như trái ngược với việc chỉ chuyển tham chiếu hàm là gì?

Vì vậy, chỉ cần chỉnh sửa thuật ngữ tại đây. Với

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

điều được ký hiệu là someObject.SomeMethod là nhóm phương pháp. Bạn chỉ có thể nghĩ về nó như là một tập các phương thức quá tải có thể được tra cứu bằng cách sử dụng ký hiệu someObject.SomeMethod.

+1

Có phải 'someObject.SomeMethod()' cũng là một nhóm phương thức? –

+1

@ John Feminella: Không, đó sẽ là một lời kêu gọi phương pháp. – jason

+0

Hmm, được rồi. Điều gì sẽ xảy ra nếu 'SomeMethod' có một số quá tải có chữ ký khớp với' SomeMethod (...) ', trong đó' ... 'là các tham số tùy ý? Có phải đó là một nhóm phương pháp sau đó, vì nó có thể đề cập đến một trong nhiều phương pháp và chưa được giải quyết? –

4

Trình biên dịch sẽ phỏng đoán rằng khi bạn nhập mã ngắn hơn, bạn có nghĩa là mã dài hơn. Không có sự khác biệt trong hiệu ứng cuối cùng. Nếu bạn muốn sự rõ ràng của toàn bộ hàm tạo, bạn có thể đặt nó vào; nếu bạn muốn ngắn gọn chỉ là nhóm phương thức, bạn có thể cho phép trình biên dịch suy ra hàm tạo. Nó chỉ là một sự lựa chọn phong cách.

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