Tôi đã tự hỏi cách thích hợp để nâng cao sự kiện từ C++/CLI là gì. Trong C# one s hould first make a copy of the handler, check if it's not null, and then call it. Có thực hành tương tự cho C++/CLI không?Cách thích hợp để tăng sự kiện từ C++/CLI?
Trả lời
C++/CLI cho phép bạn ghi đè raise
trong trình xử lý custom event để bạn không phải kiểm tra null
hoặc sao chép khi tăng sự kiện. Tất nhiên, bên trong raise
tùy chỉnh của bạn, bạn vẫn phải thực hiện việc này.
Ví dụ, chuyển thể từ MSDN cho đúng đắn:
public delegate void f(int);
public ref struct E {
f^_E;
public:
void handler(int i) {
System::Console::WriteLine(i);
}
E() {
_E = nullptr;
}
event f^ Event {
void add(f^d) {
_E += d;
}
void remove(f^d) {
_E -= d;
}
void raise(int i) {
f^ tmp = _E;
if (tmp) {
tmp->Invoke(i);
}
}
}
static void Go() {
E^ pE = gcnew E;
pE->Event += gcnew f(pE, &E::handler);
pE->Event(17);
}
};
int main() {
E::Go();
}
Đây không phải là toàn bộ câu chuyện! Bạn thường không phải lo lắng về các trình xử lý sự kiện null trong C++/CLI. Mã cho các kiểm tra này được tạo cho bạn. Hãy xem xét lớp C++/CLI tầm thường sau đây.
public ref class MyClass
{
public:
event System::EventHandler^MyEvent;
};
Nếu bạn biên dịch lớp này, và tháo rời nó bằng cách sử Reflector, bạn lấy mã C# sau.
public class MyClass
{
// Fields
private EventHandler <backing_store>MyEvent;
// Events
public event EventHandler MyEvent
{
[MethodImpl(MethodImplOptions.Synchronized)] add
{
this.<backing_store>MyEvent = (EventHandler) Delegate.Combine(this.<backing_store>MyEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)] remove
{
this.<backing_store>MyEvent = (EventHandler) Delegate.Remove(this.<backing_store>MyEvent, value);
}
raise
{
EventHandler <tmp> = null;
<tmp> = this.<backing_store>MyEvent;
if (<tmp> != null)
{
<tmp>(value0, value1);
}
}
}
}
Kiểm tra thông thường đang được thực hiện trong phương pháp nâng cao. Trừ khi bạn thực sự muốn hành vi tùy chỉnh, bạn sẽ cảm thấy thoải mái tuyên bố sự kiện của bạn như trong lớp trên, và nâng cao nó mà không sợ một trình xử lý null.
Nếu vấn đề của bạn là tăng là không tin, sau đó thực hiện nó một cách rõ ràng như các tài liệu nói:
http://msdn.microsoft.com/en-us/library/5f3csfsa.aspx
Nói tóm lại:
Nếu bạn chỉ cần sử dụng sự kiện từ khóa, bạn tạo sự kiện "tầm thường". Trình biên dịch tạo ra thêm/loại bỏ/tăng và thành viên đại biểu cho bạn. Hàm nâng cao (như tài liệu nói) kiểm tra nullptr. sự kiện tầm thường được ghi nhận ở đây:
http://msdn.microsoft.com/en-us/library/4b612y2s.aspx
Nếu bạn muốn "kiểm soát nhiều", ví dụ để làm tăng tư nhân, sau đó bạn phải thực hiện một cách rõ ràng các thành viên như trong liên kết. Bạn phải khai báo rõ ràng một thành viên dữ liệu cho loại ủy nhiệm. Sau đó, bạn sử dụng kiện từ khóa để khai báo các thành viên sự kiện liên quan, như trong ví dụ Microsoft:
// event keyword introduces the scope wherein I'm defining the required methods
// "f" is my delegate type
// "Event" is the unrealistic name of the event itself
event f^ Event
{
// add is public (because the event block is public)
// "_E" is the private delegate data member of type "f"
void add(f^d) { _E += d; }
// making remove private
private:
void remove(f^d) { _E -= d; }
// making raise protected
protected:
void raise(int i)
{
// check for nullptr
if (_E)
{
_E->Invoke(i);
}
}
}// end event block
dài dòng, nhưng có nó được.
-reilly.
- 1. Cách thích hợp để tăng ngoại lệ trong python?
- 2. Tăng sự kiện trong C#
- 3. Có mùi nào để tăng sự kiện từ một sự kiện khác không?
- 4. Tăng sự kiện Backbone.js Xem
- 5. Tăng sự kiện trong C# từ ứng dụng bên ngoài?
- 6. Tăng sự kiện hoặc gửi lệnh?
- 7. tăng sự kiện trong lớp tĩnh
- 8. Sự kiện tăng tốc Windows Phone 8
- 9. Cách tạo các sự kiện tương thích .NET trong F #?
- 10. Xử lý tăng sự kiện trong Java
- 11. dữ liệu ràng buộc thích hợp để combobox và xử lý các sự kiện của nó
- 12. Làm cách nào để tăng sự kiện trong FakeItEasy cho sự kiện dựa trên đại biểu tùy chỉnh?
- 13. Cách đặt checkbox.isChecked mà không cần tăng sự kiện
- 14. Tăng sự kiện đại biểu trong Moq
- 15. Cách xử lý sự kiện thích hợp trong C++ là gì?
- 16. Moq'ing việc tăng sự kiện nhiều lần
- 17. Khi nào nó thích hợp để tăng kích thước chuỗi không đồng bộ từ số không?
- 18. Cách thích hợp trong Python để tăng lỗi trong khi thiết lập các biến
- 19. cách Tăng sự kiện tùy chỉnh từ bên trong đối tượng tập lệnh java
- 20. Làm cách nào để tăng sự kiện bằng cách sử dụng Moq?
- 21. Cách thích hợp để nhận được http referrer từ jquery
- 22. Cách thích hợp để nhận biến từ một lớp khác
- 23. Sự kiện xử lý sự kiện trong C# có bao giờ tăng ngoại lệ không?
- 24. Mouseless Kéo và thả - thay đổi cách sự kiện này được nâng lên (tăng thả/kéo sự kiện programatically)
- 25. Có trường hợp nào Application.Exit() không tăng sự kiện FormClosing không?
- 26. Tăng sự kiện tùy chỉnh trong C# WinForms
- 27. cách thích hợp để chỉ định động xem backbone.js el
- 28. Cách thích hợp để lập tài liệu hoặc lập biểu đồ các mô hình sự kiện tùy chỉnh trong DOM
- 29. C#: Cách thích hợp để đóng SerialPort với Winforms
- 30. swing: Trình nghe thích hợp cho các sự kiện thay đổi JTextField
Vấn đề của tôi với phương pháp này là phương pháp "nâng cao" không phải là riêng tư (như trong C#) và hiển thị trong phần intellisense. –
@Filip: Vì vậy, đi với một sự kiện tùy chỉnh và đặt 'riêng:' ở phía trước. –