2010-05-11 42 views
12

Trong vài ngày qua tôi đã hỏi một số câu hỏi về đại biểu HEREHERE. Tôi thú nhận ... Tôi không thực sự hiểu các đại biểu. Và tôi thực sự REALLY REALLY muốn hiểu và làm chủ chúng. (Tôi có thể định nghĩa chúng - gõ con trỏ chức năng an toàn - nhưng vì tôi có ít kinh nghiệm với ngôn ngữ loại C nó không thực sự hữu ích.)Trợ giúp hiểu rõ các đại biểu, sự kiện và tổ chức sự kiện .NET

Bất cứ ai có thể giới thiệu một số tài nguyên trực tuyến sẽ giải thích các đại biểu theo cách mà không có gì?

Đây là một trong những khoảnh khắc mà tôi nghi ngờ rằng VB thực sự chấp nhận tôi vì nó có một số hệ thống dây điện cho tôi đằng sau hậu trường.

Tài nguyên lý tưởng sẽ giải thích những gì đại biểu, không tham chiếu đến bất kỳ điều gì khác như (sự kiện và tổ chức sự kiện), cho tôi biết tất cả mọi thứ được kết nối, giải thích như tôi đã học chúng độc đáo như một loại (có thể sử dụng một phép thuật ildasm chút)). Nền tảng đó sau đó sẽ mở rộng để giải thích cách các đại biểu có liên quan đến các sự kiện và tổ chức sự kiện mà sẽ cần một lời giải thích khá tốt trong đó có quyền. Cuối cùng, tài nguyên này có thể kết hợp tất cả lại với nhau bằng cách sử dụng các ví dụ thực tế và giải thích những gì DOES tự động thực hiện bởi trình biên dịch, cách sử dụng chúng, v.v. Và, vâng, khi bạn nên và không nên sử dụng đại biểu, nói cách khác, nhược điểm và lựa chọn thay thế để sử dụng các đại biểu.

Điều gì xảy ra? Có thể nào các bạn chỉ cho tôi (các) tài nguyên có thể giúp tôi bắt đầu hành trình của mình để làm chủ được không?

EDIT Một điều cuối cùng. Các nguồn tài nguyên lý tưởng sẽ giải thích làm thế nào bạn có thể và không thể sử dụng các đại biểu trong một tuyên bố giao diện. Đó là cái gì đó thực sự vấp ngã tôi.

Cảm ơn sự giúp đỡ của bạn.

Seth

+0

Rất khó phân biệt các đại biểu từ các sự kiện và người tổ chức sự kiện trong phần giải thích vì các đại biểu được tạo ra chủ yếu để làm cho các tính năng đó có thể. Do đó, các đại biểu và sự kiện thường được hầu hết mọi người nghĩ đến, đặc biệt là những người đang cố gắng giải thích chúng. –

+1

bản sao có thể có của [Tại sao cố gắng hiểu các đại biểu cảm thấy muốn cố gắng hiểu bản chất của vũ trụ?] (Http://stackoverflow.com/questions/2678632/why-does-trying-to-understand-delegates-feel- like-trying-to-understand-the-nature) –

+0

@Seth - xin chào Seth, tôi chính xác ở vị trí của bạn. và tôi không bằng bất kỳ phương tiện nào coi mình là một thằng ngốc. tôi đã đọc lời giải thích của Chris Sell (không hiểu), đã đọc một lời giải thích trong sách giáo khoa (tôi có ý tưởng về nó là gì nhưng chỉ là một khái niệm mơ hồ khi sử dụng nó), đã đọc câu trả lời tràn ngăn xếp: Tôi vẫn không có một nắm vững khi nào/tại sao sử dụng nó: bạn đã bao giờ nhận được để dưới cùng của nó? Nếu vậy xin vui lòng giúp chúng tôi tất cả ra với lời giải thích của bạn? – BKSpurgeon

Trả lời

6

giải thích ưa thích của tôi xuất phát từ Chris Sells:

http://sellsbrothers.com/public/writing/delegates.htm

+0

Tôi sẽ tự đặt mình vào nhưng điều này tốt hơn nhiều. ++ – Ryan

+0

Liên kết này dường như đã chết ngay bây giờ ... – Ken

+0

Tôi đã cập nhật liên kết. –

0

Hãy xem hướng dẫn # lập trình C - here là phần đại biểu.

12

Lời giải thích đơn giản nhất là một đại biểu cho phép bạn tự động định giá trị "tên" của một phương pháp cho một biến hoặc vượt qua nó xung quanh như một tham số (bạn không chỉ định một tên chuỗi, nó là một tham chiếu đến chính phương thức mà bạn đang gán cho biến).

Mã khác sau đó có thể tìm trong biến và gọi phương thức được lưu trữ ở đó sau này.

Đại biểu phải có định nghĩa (như giao diện) và đối với điều này bạn sử dụng từ khóa đại biểu. Giả sử chúng ta có một đâu đó định nghĩa đại biểu trông như thế này:

public delegate bool NotifyFriendsDelegate(int intensity); 

này về cơ bản chỉ nói rằng bất kỳ phương pháp (bất cứ nơi nào) mà trả về một boolean, và mất một tham số duy nhất của kiểu int là một thể hiện của ủy nhiệm này.Vì vậy, định nghĩa đại biểu chỉ định một hình dạng hoặc chữ ký, các phương thức đó phải khớp.

Sau đó nói rằng chúng ta có một lớp học như thế này:

public class MyCar 
{ 

    public bool GoVisitMyFriends(NotifyFriendsDelegate thingToDoWhenWeGetThere) 
    { 
     var doOurFriendsLikeUs = false; 
     var driving = new DrivingClass(); 
     var didWeGetThere = driving.DoTheDrivingNowPlease(); 

     if(didWeGetThere) 
     { 
       doOurFriendsLikeUs = thingToDoWhenWeGetThere(11); 
     } 
     return doOurFriendsLikeUs; 
    } 
} 

Lớp này đại diện cho một chiếc xe hư cấu, và nó có một phương pháp đơn giản mà làm cho chiếc xe để lái xe đến nhà người bạn của chúng tôi. Nếu xe đến nhà bạn bè của chúng tôi, chúng tôi sẽ thông báo cho bạn bè của chúng tôi rằng chúng tôi đã đến ... nhưng lớp xe không biết chính xác cách thông báo cho bạn bè của chúng tôi. Chúng tôi có thể chơi âm thanh nổi thực sự to, chúng tôi có thể thổi còi, hoặc chúng tôi có thể sử dụng một bullhorn.

Vì phương pháp GoVisitMyFriends không biết cách thông báo cho bạn bè chính xác, thay vào đó nó yêu cầu mã gọi điện chuyển qua tham chiếu đến một số phương pháp có thể thực hiện phần thông báo. GoVisitMyFriends không quan tâm bạn sử dụng phương thức nào, miễn là phương thức được định hình giống như định nghĩa của NotifyFriendsDelegate (nó phải trả về boolean và chấp nhận một tham số kiểu int).

Bây giờ cho phép tạo ra một lớp đơn giản mà sử dụng xe hư cấu của chúng tôi:

public class MyFunClass() 
{ 
    public bool NotifyFriendsByRammingTheirHouse(int howHard) 
    { 
     var rammingModule = new RammingModule(); 
     return rammingModule.RamFriendsHouse(howHard); 
    } 

    public bool DoSomethingFun() 
    { 
     var car = new MyCar(); 
     var areWeCool = car.GoVisitMyFriends(NotifyFriendsByRammingTheirHouse); 
     return areWeCool; 
    } 
} 

Lớp này chứa một phương pháp mà phù hợp với chữ ký của người NotifyFriendsDelegate. Nó chứa một phương thức được gọi là DoSomethingFun, tạo ra một cá thể của MyCar sau đó gọi phương thức GoVisitMyFriends. Và nó vượt qua phương thức NotifyFriendsByRammingTheirHouse để lớp MyCar biết cách chúng tôi muốn thể hiện tình yêu của mình cho bạn bè khi chúng tôi đến đó.

Và đó là hình thức sử dụng đại biểu đơn giản nhất mà tôi có thể nghĩ đến.

BTW: Tôi luôn thấy hữu ích khi nghĩ về các sự kiện dưới dạng biến đặc biệt chứa tập hợp các phương thức ủy nhiệm. Sự kiện có thể được gán bất kỳ số nào (không đến vô hạn) của các đại biểu, TẤT CẢ các sự kiện sẽ được gọi khi sự kiện được gọi. Sự kiện chỉ là các nhóm đại biểu có thể được coi là "một điều".

+0

Tôi ghét trích dẫn này: "Điều này về cơ bản chỉ nói rằng bất kỳ phương thức nào (ở bất kỳ đâu) trả về một boolean, và lấy một tham số duy nhất của kiểu int là một cá thể của đại biểu này". Nhưng tôi không thể đổ lỗi cho Bạn. Chủ đề khó giải thích. Tôi thậm chí không dám thử. Theo quan điểm của tôi, sự tương tự tốt hơn là hàm ẩn danh giống như hàm chữ, hàm bình thường giống như hằng số có tên và biến đại biểu là ... một biến. –

+0

Hehe, tôi biết ý bạn là gì. Nếu bạn đào sâu vào việc thực hiện kỹ thuật thì gần như không có gì trong câu trả lời của tôi là "đúng" hoặc "chính xác". Nhưng tôi đã thấy rằng cách suy nghĩ chung này về các đại biểu là khá tốt ở các nhà phát triển hàng đầu để hiểu một cách hữu ích về những gì đại biểu là tất cả về. Từ đó, một bức tranh chính xác hơn có thể phát triển ... nhưng nhận được ý tưởng tổng quát mờ là một phần khó khăn. –

+0

Sự kiện thực sự là một trình bao bọc xung quanh bộ sưu tập của các đại biểu. Trường hợp duy nhất mà các đại biểu multicast là các imo hữu ích. – nawfal

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