2010-02-09 31 views
27

Tôi có phương pháp được hiển thị bên dưới đang tạo cảnh báo Phân tích mã CA1822. CA1822 nói điều này:C# Mã phân tích CA1822 Cảnh báo - Tại sao?

"The 'this parameter (or 'Me' in Visual Basic) of 'ImportForm.ProcessFile(StreamReader)' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this/Me' in the method body or at least one property accessor, if appropriate."

bất cứ ai có thể cho tôi biết tại sao tôi nhận được cảnh báo này, kể từ khi thông số 'đọc' là trong thực tế được sử dụng?

private void ProcessFile(StreamReader reader) 
{ 
    string[] lines; 

    lines = reader.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None); 

    ParseFile.IVAFile(lines); 
} 

Trả lời

42

Điều đó có nghĩa là bạn không sử dụng thành viên nào của đối tượng. Tất cả các mục trong phương thức đến từ các tham số.

Do đó, phương pháp này có thể được thực hiện một cách an toàn.

15

"trình đọc" đang được sử dụng, nhưng bạn không sử dụng "địa chỉ này" ở bất kỳ đâu, vì vậy bạn có thể làm cho phương thức tĩnh.

Lý do duy nhất không để làm cho nó tĩnh sẽ là nếu bạn muốn sử dụng đa hình sau này - ví dụ: làm cho nó ảo và ghi đè nó ở nơi khác.

2

Tôi nghĩ rằng nó đang cố gắng cho bạn biết rằng phương pháp này có thể được thực hiện tĩnh.

Điều duy nhất mà phương pháp này cần truy cập là "trình đọc", nhưng không có gì từ cá thể lớp mà nó thuộc về ("this"). Trong trường hợp đó, bạn có thể làm cho nó tĩnh.

2

Cảnh báo xảy ra vì bạn không sử dụng bất kỳ biến thành viên nào của lớp đó trong phương thức đó. Ví dụ.

this.m_anyVariable = anyValue; 

Vì vậy, bạn có thể/nên đánh dấu phương thức đó là tĩnh.

+5

Tại sao * nên * phương pháp được đánh dấu là tĩnh? Lợi ích là gì? –

+5

Ahh, vì hiệu suất. Từ MSDN: "Sau khi bạn đánh dấu các phương thức là tĩnh, trình biên dịch sẽ phát ra các trang web cuộc gọi không phải là ảo. Các trang web gọi non-virtual sẽ ngăn chặn việc kiểm tra thời gian chạy cho mỗi cuộc gọi đảm bảo rằng con trỏ đối tượng hiện tại là không null. có thể đạt được hiệu suất có thể đo lường được đối với mã nhạy cảm với hiệu suất. Trong một số trường hợp, việc không truy cập vào cá thể đối tượng hiện tại thể hiện vấn đề chính xác. " –

3

Có thể tôi đã tìm thấy hành vi nguy hiểm của thư này.

Trong một tình huống như thế

void Print() 
{ 
    Console.Writeline(GetType().Name); 
} 

tôi nhận được CA1822 này được báo cáo, mặc dù GetType() là một phương pháp dụ. Tuy nhiên, tôi tìm thấy một số giải thích, tại sao GetType() thực sự không phải là một phương pháp ảo, không phải là một phương pháp thay thế, và kỹ thuật hành xử như một phương pháp tĩnh.

Chỉ là mã Phân tích không xem xét hành vi đặc biệt này.

+0

Bạn đã cố gắng buộc 'this.GetType(). Name'? Điều đó có xóa cảnh báo không? –

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