Tôi đã nhìn thấy loại mã này một số nơi:C#: Khởi tạo một event handler với một hình nộm
public event SomeEventHandler SomeEvent = (s, e) => { };
Có phải đó là một cách khuyến khích làm việc? Nó giải quyết những gì, và nó có tác dụng phụ đáng chú ý nào không? Tôi vẫn phải thực hiện kiểm tra không? Hay đó chính là điều tôi không phải làm nữa? Bộ sưu tập rác sẽ vẫn hoạt động đúng không?
Ví dụ:
private PropertyChangedEventHandler propertyChanged;
private readonly object propertyChangedLock = new object();
public event PropertyChangedEventHandler PropertyChanged
{
add
{
lock (propertyChangedLock)
propertyChanged += value;
}
remove
{
lock (propertyChanged)
propertyChanged -= value;
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler;
lock (propertyChangedLock)
handler = propertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
Tôi có thể thay đổi dòng đầu tiên vào này:
private PropertyChangedEventHandler propertyChanged = (s, e) => { };
Và sau đó bỏ qua null-kiểm tra trong phương pháp OnPropertyChanged? Và nếu sau đó tôi bỏ qua kiểm tra null, tôi có thể bỏ qua khóa không? Nếu như vậy sẽ cho tôi điều này:
protected void OnPropertyChanged(string propertyName)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Điều đó có an toàn khi thực hiện việc khởi tạo tài khoản không? Hoặc có một số tác dụng phụ mà tôi đã bỏ lỡ?
Bài viết của tôi về chủ đề: http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx –
Bài viết hay! Nói cách khác, việc loại bỏ kiểm tra null sẽ là thread-safe trong trường hợp này. Nhưng người đăng ký cần có trình xử lý thông minh không bị hỏng. Tôi có đúng không? – Svish