5

Tôi có một lớp học như thế này:Phân tích mã VS2010. Suppress nhắn CA1051: DoNotDeclareVisibleInstanceFields cho tất cả các thành viên lớp

public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Khi tôi chạy VS2010 được xây dựng trong công cụ Phân tích Mã, tôi nhận được cảnh báo giống hệt nhau: rằng 'trường' ... 'hiển thị bên ngoài loại khai báo của nó, thay đổi khả năng truy cập của nó thành riêng tư và thêm thuộc tính, với cùng khả năng truy cập như trường hiện tại, để cung cấp quyền truy cập vào nó'.

tôi muốn ngăn chặn cảnh báo này cho tất cả các lĩnh vực trong lớp học của tôi Foo, nhưng tôi không muốn đánh dấu tất cả các lĩnh vực với SuppressMessage thuộc tính như thế này:

public class Foo 
{ 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int A = 1; 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int B = 2; 
} 

tôi muốn đánh dấu tất cả các thành viên lớp , sử dụng mã như sau:

[SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Nhưng mã này không hoạt động, tôi vẫn nhận được cảnh báo phân tích mã. Tôi làm cách nào để thực hiện chính xác?

+0

tôi nghĩ rằng bạn đã tìm thấy lỗi, đăng lên connect.microsoft.com –

+0

bất kỳ giải pháp cuối cùng nào về nó? – Kiquenet

Trả lời

10

Không có cách nào để chặn nhiều hơn 1 thư mỗi lần bằng SuppressMessageAttribute.

Như thảo luận có thể được tìm thấy here, nhưng phần có liên quan là:

Bạn đang chạy vào một sự hiểu lầm phổ biến về SuppressMessage.

Mỗi khi bạn đặt một SuppressMessage trong một tệp nguồn, bạn chặn chính xác một vấn đề (một "hàng" trong lưới). Giai đoạn.

Một SuppressMessage có thể được đặt "vi phạm" gần hoặc ở mức mô-đun . Mức mô-đun, mức lắp ráp và triệt tiêu toàn cầu tất cả đều có cùng ý nghĩa. Bằng cách đặt ở cấp mô đun, bạn không chặn nhiều trường hợp của sự cố cùng một lúc. Bạn chỉ cần truy cập vào số xác định vị trí SuppressMessage ở một vị trí khác của mã. Chính lợi ích là bạn có thể, ví dụ, thu thập tất cả các sự đàn áp liên quan đến việc lắp ráp trong một tệp duy nhất (ví dụ: GlobalSuppressions.cs).

Khi bạn sử dụng SuppressMessage cấp mô-đun, bạn phải chỉ định mục tiêu . Mục tiêu phải khớp chính xác với những gì được báo cáo trong GUI cho vi phạm quy tắc.

Không có cách nào để sử dụng SuppressMessage để ngăn chặn một quy tắc cho toàn bộ phạm vi của một lớp hoặc toàn bộ phạm vi của một không gian tên.

+0

Cảm ơn bạn rất nhiều! Có vẻ như tôi thực sự không hiểu khái niệm SuppressMessage một cách chính xác! Ansver của bạn đã giúp tôi rất nhiều. Bây giờ tôi đã có ý tưởng. – feorex

1

Bạn có thể tạo tập tin quy tắc CodeAnalysis với một bộ quy tắc như: bước

<?xml version="1.0" encoding="utf-8"?> 
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> 
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" 
     RuleNamespace="Microsoft.Rules.Managed"> 
    <Rule Id="CA1111" Action="Ignore" /> 
    </Rules> 
</RuleSet> 

Xem bước hương:

+0

Cảm ơn bạn đã trả lời, nhưng tôi không muốn chặn quy tắc này cho tất cả mã trong ứng dụng của tôi. Có cách nào để ngăn chặn quy tắc này cho một lớp duy nhất không? – feorex

+0

@feorex: IIRC bạn có thể xác định thuộc tính SupressMessage cho bất kỳ phương thức cụ thể nào – sll

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