2009-03-10 37 views
12

Các Hướng dẫn thiết kế khung (2nd Ed, trang 327). Nói:Làm thế nào để thực hiện mô hình xử lý bằng phương pháp gần đúng (CA1063)

XÉT cung cấp phương pháp Close(), ngoài các Dispose(), nếu gần là tiêu chuẩn thuật ngữ trong khu vực.

Khi làm như vậy, điều quan trọng là bạn thực hiện việc triển khai Đóng giống hệt với Dispose và xem xét thực hiện phương pháp IDisposable.Dispose một cách rõ ràng.

Vì vậy, làm theo tấm gương cung cấp, tôi đã có lớp học này:

public class SomeClass : IDisposable { 
    private SomeDisposable someInnerDisposable; 

    public void Open() { 
     this.someInnerDisposable = new SomeDisposable(); 
    } 

    void IDisposable.Dispose() { 
     this.Close(); 
    } 

    public void Close() { 
     this.Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) { 
     if (disposing) { 
      this.someInnerDisposable.Dispose(); 
      this.someInnerDisposable = null; 
     } 
    } 
} 

FxCop dường như không thích điều đó:

CA1816: Microsoft.Usage: 'SomeClass .Đóng() 'cuộc gọi' GC.SuppressFinalize (đối tượng) ', một phương pháp thường chỉ được gọi trong một thực hiện' IDisposable.Dispose '. Tham khảo mẫu IDisposable để biết thêm thông tin.

CA1816: Microsoft.Usage: Thay đổi 'SomeClass.IDisposable.Dispose()' để gọi 'GC.SuppressFinalize (object)'. Điều này sẽ ngăn chặn việc hoàn thành không cần thiết của đối tượng khi nó đã được xử lý và nó đã rơi ra khỏi phạm vi.

CA1063: Microsoft.Design: Sửa đổi 'SomeClass.IDisposable.Dispose()' để nó gọi Dispose (true), sau đó gọi GC.SuppressFinalize trên đối tượng hiện tại ('this' hoặc 'Me' trong Visual Basic), và sau đó trả về.

CA1063: Microsoft.Design: Đổi tên 'SomeClass.IDisposable.Dispose()' thành 'Dispose' và đảm bảo rằng nó được khai báo là công khai và được niêm phong.

  • Làm thế nào để triển khai mẫu vứt bỏ với phương pháp đóng một cách chính xác?

-hoặc-

  • Làm thế nào để ngăn chặn những lời cảnh báo?

tôi đã cố gắng

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly", 
    Justification = "Framework Design Guidelines say it's ok.")] 
void IDisposable.Dispose() 
{ 
    this.Close(); 
} 

nhưng FxCop 1,36 vẫn báo cáo cho họ.

EDIT: Thay đổi nó xung quanh như đề xuất loại bỏ tất cả nhưng cảnh báo này:

CA1063: Microsoft.Design: Đổi tên 'SomeClass.IDisposable.Dispose()' thành 'Vứt bỏ' và đảm bảo rằng nó là tuyên bố là công khai và niêm phong.

EDIT 2: CODE_ANALYSIS thực sự bị thiếu. Cảm ơn.

Trả lời

15

Thay đổi xung quanh.

Có Close() gọi đây.Vứt bỏ() và đặt logic trong phương thức Dispose() thay vì phương thức Close().

------------------- Thông tin khác sau khi chỉnh sửa ---------------

Ngoài ra, thay đổi khai báo tới:

public void Dispose() 

cần loại bỏ lỗi khác. Vì bạn đã tuyên bố là:

void IDisposable.Dispose() 

Nó không được đánh dấu là công khai và bị niêm phong và FxCop than phiền. Cá nhân tôi thích tránh các lỗi thay vì đè nén chúng.

1

Làm cách nào để ngăn chặn các cảnh báo?

SuppressMessage() chỉ hoạt động khi bạn chỉ định cờ CODE_ANALYSIS làm biểu tượng biên dịch có điều kiện.

Các vấn đề liên quan