Tôi nghĩ câu trả lời là KHÔNG? Nếu không có, tại sao chúng tôi đã tách các lớp học Delegate
và MulticastDelegate
? Có lẽ nó một lần nữa vì "một số ngôn ngữ .NET khác"?Có một đại biểu không phải là một MulticastDelegate trong C#?
Trả lời
EDIT: I nghĩ đây là một phần của ECMA 335, nhưng tôi không thể nhìn thấy nó ở đó ở bất cứ đâu.
Bạn không thể tạo như một loại đại biểu trong C#, nhưng bạn có thể trong IL:
.class public auto ansi sealed Foo
extends [mscorlib]System.Delegate
{
// Body as normal
}
Các biên dịch C# không có vấn đề sử dụng một đại biểu như:
using System;
class Test
{
static void Main()
{
Foo f = x => Console.WriteLine(x);
f("hello");
}
}
Nhưng CLR hiện khi nào cố gắng tải:
Ngoại lệ không khớp: System.TypeLoadException: Không thể tải loại 'Foo' từ lắp ráp 'Foo, Phiên bản = 0.0.0.0, Văn hóa = trung lập, PublicKeyToken = null 'vì nó không thể kế thừa trực tiếp từ lớp đại biểu. tại Test.Main()
Về cơ bản, Delegate/MulticastDelegate là một tai nạn lịch sử. Tôi tin rằng các phiên bản alpha/beta ban đầu đã tạo ra sự khác biệt, nhưng nó tỏ ra quá khó hiểu và thường không hữu ích - vì vậy bây giờ, mỗi người tham gia có nguồn gốc từ MulticastDelegate.
(Điều thú vị là đặc điểm kỹ thuật # C chỉ đề cập đến MulticastDelegate một lần, trong danh sách các loại trong nước chưa được sử dụng như những hạn chế chung.)
Không, CLR không cho phép điều đó.
Tôi nhớ lại điều gì đó mà họ muốn hiển thị trực tiếp Delegate
, nhưng điều đó không bao giờ cần thiết.
Không, không có, vì tất cả các đại biểu phải tự nhiên có thể là Delegate.Combine
ed. Ủy quyền là có đơn giản để bọc các chức năng không multicast vào một lớp cơ sở.
Ngay cả khi mọi đại biểu có một con trỏ phương pháp và đích, Delegate.Combine có thể được thực hiện tốt: chỉ cần tạo một đối tượng có hai trường đại biểu thích hợp, chạy theo tuần tự. Việc sử dụng MulticastDelegates có thể mang lại lợi thế về hiệu suất trong các tình huống mà các đại biểu có số lượng đại biểu phụ thường xuyên chạy, nhưng hiếm khi liên quan đến Kết hợp và Xoá, nhưng tôi sẽ ngạc nhiên nếu nó mang lại hiệu suất tốt hơn trong các tình huống điển hình hơn. Cá nhân, tôi ước rằng có một loại "danh sách sự kiện" có thể thay đổi, có lẽ là một cấu trúc với một trường duy nhất ... – supercat
... của kiểu Object, có thể giữ một giá trị rỗng, một đại biểu đơn lẻ hoặc một mảng đại biểu và bao gồm một phương thức để gọi trường đó là thích hợp cũng như thực hiện các thao tác Thêm và Loại bỏ an toàn theo luồng (bằng cách sử dụng Khóa liên động.CompareExchange); các phương thức gọi sẽ cung cấp một lựa chọn dừng tại ngoại lệ đầu tiên, hoặc cho phép tất cả các trình xử lý chạy và ném một BundledException với một danh sách tất cả các ngoại lệ đã xảy ra trong khi chạy chúng. Có danh sách sự kiện giữ tham chiếu đại biểu, thay vì danh sách các phương thức và mục tiêu sẽ loại bỏ quirks trong phương pháp hiện có. – supercat
System.MuticastDelegate có nguồn gốc từ System.Delegate. Mỗi cấp trong phân cấp đại biểu cung cấp một tập hợp các dịch vụ khác nhau. System.Delegate là một thùng chứa dữ liệu cho phương thức để gọi trên một đối tượng cụ thể. Với System.MulticastDelegate có khả năng bổ sung không chỉ gọi một phương thức trên một đối tượng duy nhất, mà còn trên một bộ sưu tập các đối tượng. Điều này cho phép nhiều người đăng ký tham dự một sự kiện.
Không chắc chắn, tôi đã trả lời câu hỏi của bạn.
Trong khi đó âm thanh thích hợp, nó không giải thích tại sao GetInvocationList (rõ ràng về cách gọi * nhiều * phương pháp) là một phần của đại biểu, và không MulticastDelegate ... –
- 1. một nhà xây dựng như một đại biểu - là nó có thể trong C#?
- 2. Có phải Danh sách <T> trong đó T là một đại biểu ẩn danh có thể không?
- 3. C# đại biểu không làm việc như nó phải không?
- 4. Không thể chuyển đổi biểu thức lambda để gõ 'chuỗi' vì nó không phải là một loại đại biểu
- 5. Phạm vi của một đại biểu trong C#
- 6. Tôi có thể sử dụng BeginInvoke với MulticastDelegate không?
- 7. Gán một phương pháp IronPython đến một C# đại biểu
- 8. Có cần thiết một tin nhắn đại biểu phải luôn luôn có hiệu lực như một kiểu trả về không?
- 9. Đại biểu trong C++ 11
- 10. Đại biểu UISplitViewController trong một singleton
- 11. Đại biểu Constructor C++
- 12. Tại sao các đại biểu theo phong cách .NET không phải là đóng cửa trong Java?
- 13. Gọi đại biểu về một chủ đề cụ thể C#
- 14. Đại biểu là gì?
- 15. List.ForEach có phải là một phần của LINQ hay không?
- 16. C# [đại biểu] mới không cần thiết?
- 17. Nhiều đại biểu trong mục tiêu C
- 18. Các đại biểu trong SWIG - C#
- 19. Không thể chuyển đổi phương pháp vô danh để gõ 'System.Delegate' vì nó không phải là một loại đại biểu
- 20. ORA-00.979 không phải là một nhóm bởi biểu
- 21. các đại biểu vô danh trong C#
- 22. C#; tạo một đại biểu mới mà không khai báo phương thức một cách riêng biệt?
- 23. Điểm đại biểu là gì?
- 24. đại biểu tiêu chuẩn trong C#
- 25. Nhiều đại biểu cho một đối tượng?
- 26. Đại biểu trong IOS - Một số yêu cầu làm rõ
- 27. Có phải là một lớp trong java?
- 28. Tên mảng có phải là một con trỏ không đổi trong C++ không?
- 29. Cast đại biểu đến Func trong C#
- 30. __unsafe_unretained cho một đại biểu sẽ không xây dựng
PEVerify nói gì trên cụm từ đó với 'Foo'? – leppie
@leppie: Chưa thử. Hãy làm như vậy :) (Tôi chỉ chạy ildasm trên một tuyên bố "bình thường" để có được IL, sau đó doctored nó và ilasmed.) –
Tôi sử dụng ilasm/ildasm cho một đại biểu thử nghiệm và nhận được kết quả mong đợi trong câu trả lời của bạn . Cảm ơn. –