Ví dụ, tôi có một phương pháp cơ sở xuất bản sự kiện:.NET: Tạo EventArgs mới mỗi lần sự kiện này có thực thi tốt không?
protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}
Đối với một lớp được thừa kế đó sẽ ghi đè OnSomeEvent
và đặt ra một sự kiện bổ sung khi nó cháy:
protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);
if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}
Và nếu nguồn gốc tiếp tục như thế này , nó sẽ tạo ra một EventArgs có nguồn gốc mới cho mỗi thế hệ của lớp dẫn xuất yêu cầu nó. Tuy nhiên có vẻ như dẫn xuất khác nhau của EventArgs
trên khuôn khổ .NET không được thiết kế để có thể thay đổi (không có setters), điều này ngăn cản một đối tượng từ giữ một trường hợp duy nhất của EventArgs và sửa đổi nó khi nó đi.
Vì vậy, mỗi khi một sự kiện như thế này xảy ra, nó sẽ cấp phát lại bộ nhớ cho tất cả các đối tượng EventArgs
có liên quan. Trong một ứng dụng đồ họa dữ dội nơi một sự kiện có thể được kích hoạt hàng chục lần mỗi giây (chẳng hạn như OnPaint
sự kiện trên một điều khiển), đây thực sự là một thực hành tốt?
Tôi có nên thực hiện một số thay đổi cho OnExtendedEvent()
và làm cho ExtendedEventArgs
có thể thay đổi được không?
protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;
ExtendedEvent(this, extendedArgs);
}
EDIT: Sửa mã ví dụ, nên rõ ràng hơn bây giờ.
Nguồn gốc không phải là vấn đề, lớp dẫn xuất chỉ có thể gọi base.OnExtendedEvent với EventArgs.Empty. Nói chung, đừng sợ tạo ra rác thải ngắn. –
Tôi nghĩ bạn có nghĩa là bất biến thay vì có thể thay đổi. Bất biến có nghĩa là bạn không thể thay đổi nó. – aaronb