2009-04-24 17 views
6

Khi tôi thực hiện một sự kiện trong Visual Studio, Resharper là loại, đủ để cung cấp để tạo ra một sự kiện invocator cho tôi. Tôi thường làm điều này bằng tay trong quá khứ, và invocators tôi luôn luôn nhìn như thế nàyInvocators sự kiện trong C#

private void InvokePropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

nhưng invocator tạo ra bởi Resharper trông như thế này (dọn dẹp một chút bằng tay)

private void InvokePropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler changed = PropertyChanged; 

     if (changed != null) 
     { 
      changed(this, e); 
     } 
    } 

Làm người ở jetbrains biết gì về C# Tôi không? Có một số lợi thế kỹ thuật để có các biến địa phương, hoặc là nó chỉ là một tạo tác của họ phải tự động tạo mã?

Trả lời

8

Có. Họ biết rằng số người đăng ký một sự kiện có thể thay đổi giữa "if" và cuộc gọi tới trình xử lý sự kiện. Họ nắm bắt nó ở một địa phương, nơi nó không thay đổi nữa.

+0

là u chắc chắn về điều đó? không cả hai người trong số họ "điểm" vào danh sách yêu cầu tương tự? – BFree

+1

Không nhất thiết. Toàn bộ danh sách có thể thay đổi, nói chung. Lưu ý rằng ReSharper là một công cụ "chung". Bạn dường như giả định điều duy nhất xảy ra với sự kiện là + = và - =. Có lẽ có, có thể không, nhưng cách "ReSharper" bao gồm tất cả các căn cứ. –

+1

Trên thực tế số lượng người đăng ký không quan trọng, điều đó được thực hiện bởi chính người được ủy quyền. Thực tế là các đại biểu là null nếu không có thuê bao, mặc dù, là quan trọng. Nếu không có người đăng ký, trường này là rỗng. Bạn sao chép một tham chiếu null, vì vậy nếu một thuê bao được thêm vào sau khi nếu bạn sẽ chỉ không nhìn thấy nó bằng cách sẽ không thất bại. –

5

Tôi nghĩ rằng John Saunders có lẽ có câu trả lời hay nhất.

Để lưu nội dung, tôi thậm chí không viết "Invocators" nữa. Tôi có các phương pháp mở rộng làm điều đó cho tôi và tôi chỉ cần gọi PropertyChanged.Fire(this, "propName");

Xem this article để biết thêm thông tin.

+2

Hey, thật tuyệt. Vui mừng tôi hỏi. – MichaC

+0

Bạn không hoàn toàn lấy đi khả năng ghi đè hành vi của người tổ chức sự kiện ở đây? Bạn không có cơ hội thay đổi hành vi trong các lớp dẫn xuất. – bberger

+0

@bberger Tôi cho rằng, nhưng làm điều đó rất hiếm. NẾU bạn cần hành vi mở rộng, thì hãy làm theo cách học cũ? –

1

Đây chỉ là vấn đề đa luồng. Điều này bảo vệ bạn trong một môi trường đa luồng.

Ví dụ, lấy kịch bản này:

if (PropertyChanged != null) // PropertyChanged has one subscriber here 
{ 

Bây giờ, một sợi thứ hai sẽ hủy đăng ký ở đây, điều chỉnh xử lý sự kiện ....

PropertyChanged(this, e); // This is no longer valid! 
} 
Các vấn đề liên quan