2013-07-23 30 views
5

Tôi là người mới bắt đầu trong các sự kiện C# và đại biểu. Vài câu hỏi có ý nghĩa nếu bạn nhìn vào the URL I have used to learn about events.Cách tạo một sự kiện trong C#

  1. Tôi có thể có sự kiện mà không có người được liên kết với nó không? Những hình ảnh mà tôi đã tìm thấy luôn luôn có chúng với nhau.

  2. Ví dụ: Tôi không hiểu sự kiện được tạo ra như thế nào. Tôi hoàn toàn bị mất, tôi hiểu rằng Tick được định nghĩa là một sự kiện nhưng mô tả sự kiện của Tick là gì? nơi nào tôi xác định những gì tạo thành Tick?

  3. Ngoài ra giá trị Tick được bao giờ bắt đầu. Dường như tất cả các ví dụ tôi đã xem xét không bao giờ khởi tạo sự kiện và có một tuyên bố tương tự để tuyên bố: Nếu (Tick! = Null) trong ví dụ đính kèm nhưng nó không phải là obviuos mà Tick được khởi tạo. Tôi đã nhìn xung quanh và tôi không thể tìm thấy bất kỳ câu trả lời nào.
    Cảm ơn trước sự giúp đỡ của bạn

+0

@Tim: Tôi đã tự hỏi bạn đã lấy đi URL của tôi chưa? – user1298925

+0

Hãy xem tại đây http://www.akadia.com/services/dotnet_delegates_and_events.html – Ehsan

+0

@ user1298925: Không. Anh ấy vừa định dạng câu hỏi của bạn đúng cách. –

Trả lời

4
  1. Không, sự kiện chỉ là một sử dụng đặc biệt của các đại biểu. Bạn không thể có một sự kiện mà không có một đại biểu (mặc dù bạn có thể có một đại biểu mà không có một sự kiện - đọc lên trên delegates để biết thêm thông tin).

  2. Không thực sự chắc chắn tôi hiểu câu hỏi của bạn ở đây. Mô tả sự kiện sẽ có trong tài liệu. Nhìn vào mã một mình, bạn chỉ biết rằng có một sự kiện được gọi là Tick trên đối tượng đó mà bạn có thể đính kèm một trình xử lý sự kiện.

  3. Khi bạn thêm trình xử lý sự kiện vào Tick (đó là các dòng += bạn nhìn thấy), nó sẽ trở thành không rỗng. Đó là những gì mà séc != null đang thực hiện - đảm bảo rằng ai đó đã được đính kèm vào sự kiện.

2

Sự kiện đơn giản là sự kết hợp của phương thức thêm và phương thức xóa, cả hai đều lấy một tham số duy nhất của cùng một loại đại biểu. Sự kiện nào xảy ra với đại biểu được thông qua là hoàn toàn tùy thuộc vào việc triển khai.

Điều phổ biến nhất để làm với một đại biểu sự kiện nhận được trong xử lý AddDelegate.Combine nó với các đại biểu trước đó gia tăng (nếu có), nhưng có một số khả năng khác cũng như:

Nếu một đối tượng sẽ hỗ trợ nhiều loại sự kiện, nhưng nhiều trường hợp sẽ có không có người đăng ký cho hầu hết trong số họ, người ta có thể thêm đại biểu vào một bảng. Nhiều sự kiện WinForms làm điều này.

Nếu một người muốn cho phép người đăng ký sử dụng các loại đại biểu có thể bị hoán đổi, người ta có thể đặt các đại biểu đã nhận vào một mảng, List<>, danh sách được liên kết, của đại biểu hoặc đối tượng cầm quyền.

Nếu sự kiện đại diện cho một cái gì đó mà một số loại đối tượng sẽ kích hoạt, nhưng một trường hợp cụ thể sẽ không bao giờ xảy ra, sự kiện có thể chỉ đơn giản là hủy bỏ người được ủy nhiệm. Ví dụ, hãy xem xét một lớp trừu tượng ObservableFoo với sự kiện thông báo thay đổi trừu tượng và một hợp đồng cho biết bất kỳ khi nào các thuộc tính của cá thể thay đổi sẽ gọi tất cả các đại biểu được truyền vào sẽ được gọi; một lớp học bắt nguồn từ nó có thể chấp nhận yêu cầu đăng ký, nhưng vì nó sẽ không bao giờ thay đổi, nó sẽ không bao giờ phải gọi các đại biểu được truyền vào (hoặc làm bất cứ điều gì khác với họ) và có thể loại bỏ chúng.

Vì sự kiện là một cặp phương thức lấy kiểu đại biểu làm tham số, nên mỗi sự kiện phải "theo định nghĩa" sử dụng các đại biểu làm loại tham số của nó. Tất cả các sự kiện không tầm thường phải lưu trữ các đại biểu được thông qua ở một số biểu mẫu. Cách phổ biến nhất để chấp nhận nhiều đăng ký là kết hợp chúng thành một đại biểu multicast (tôi không thích thiết kế, btw, nhưng nó là phổ biến nhất); các phương pháp tiếp cận khác có thể được sử dụng, nhưng một sự kiện sẽ sử dụng các đại biểu được thông qua phải lưu trữ chúng bằng cách nào đó.

BTW, có hai cách để khai báo một sự kiện trong C#: người ta có thể cung cấp trình xử lý thêm/xóa một cách rõ ràng, trong trường hợp đó trình biên dịch sẽ tạo sự kiện với các trình xử lý đó. Người ta cũng có thể chỉ cung cấp tên sự kiện và loại đại biểu, trong trường hợp trình biên dịch sẽ tạo một sự kiện với tên và phạm vi được chỉ định, một biến riêng có cùng tên và loại đại biểu phù hợp và phương pháp thêm/xóa an toàn chỉ thêm hoặc xóa sự kiện khỏi biến được chỉ định. Báo cáo của biểu mẫu eventName += something; hoặc eventName -= something; sẽ được xử lý dưới dạng cuộc gọi đến phương thức "thêm" hoặc "xóa"; tất cả các cách sử dụng khác của tên sẽ đề cập đến người được ủy quyền. Lưu ý rằng trong các phiên bản cũ của C#, sử dụng eventName += something;eventName -= something; trong một lớp sẽ được xử lý bằng cách sử dụng các hoạt động +=-= trên đại biểu không an toàn cho luồng, nhưng các phiên bản mới hơn đã thay đổi hành vi đó.

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