14

Tôi có đoạn mã sau:Suppress "Thành viên không bao giờ được giao cho" cảnh báo trong C#

ViewPortViewModel _Trochoid; 
public ViewPortViewModel Trochoid 
{ 
    get { return _Trochoid; } 
    set { this.RaiseAndSetIfChanged(value); } 
} 

sử dụng hỗ trợ ReactiveUI INPC. Trình biên dịch luôn cảnh báo rằng Trochoid không bao giờ được gán và sẽ luôn là rỗng. Tuy nhiên do sự kỳ diệu mà RaiseAndSetIfChanged thực hiện thông qua hỗ trợ CallerMemberName, mã hoạt động và trình biên dịch sai.

Làm cách nào để xóa sạch ngăn chặn những cảnh báo này trong mã của tôi?

Trả lời

15

Làm thế nào để sạch ngăn chặn những cảnh báo này trong mã của tôi

Một thay thế cho một bài tập không phù hợp sẽ được chỉ một số #pragma:

#pragma warning disable 0649 // Assigned by reflection 
ViewPortViewModel _Trochoid; 
#pragma warning restore 0649 

Điều đó sẽ có tác dụng và nó giữ sự xấu ở chính xác nơi mà nó có ý nghĩa để ghi lại nó - tại khai báo hiện trường.

Nếu bạn có nhiều trường được xử lý theo cách tương tự, bạn có thể đặt tất cả chúng trong cùng một "chặn" cảnh báo bị vô hiệu hóa, với nhận xét áp dụng cho tất cả chúng.

Dù bạn xem nội dung này là "sạch" hay không là vấn đề về hương vị, tất nhiên. Tôi nghĩ rằng tôi thích nó để chỉ định mà chỉ có cho tác dụng phụ loại bỏ các cảnh báo.

+0

Mặc dù một nhiệm vụ mặc định là một cái gì đó bạn cũng có thể làm anyway. Dù bằng cách nào, chúng tôi đang nói "chúng tôi biết điều này là không có gì" kể từ bây giờ. Trong số này, tôi thích yếu tố nhóm. Nhưng, tôi là ai ... –

+0

Tôi thích điều này bởi vì nó cũng sẽ ngăn chặn một dev (có thể là người đang sử dụng resharper hoặc tương tự) từ giả định các lĩnh vực có thể được thực hiện chỉ đọc. – weston

+0

Tôi có thể sử dụng SuppressMessageAttribute http://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute%28v=vs.100%29.aspx nhưng tôi không thể tìm ra cách tạo ra verbose attr từ cảnh báo trình biên dịch? – bradgonesurfing

4

Bạn có thể gán cho nó một mặc định cho một loại tài liệu tham khảo:

ViewPortViewModel _Trochoid = null; 
+0

Điều này hoạt động nhưng cảm thấy sai khi tôi ghi đè lên giá trị trong hàm tạo. – bradgonesurfing

+1

Nếu bạn có một công cụ như resharper, làm điều này sẽ làm cho nó để cho bạn biết rằng lĩnh vực này có thể được thực hiện chỉ đọc, và bạn vẫn sẽ phải đặt một bình luận để ngăn chặn điều đó. – weston

6

Bây giờ mọi nền tảng có CallerMemberNameAttribute hỗ trợ trong ReactiveUI, không cần phải chịu đựng sự áp bức của Obsessive Compulsive trình biên dịch của bạn:

ViewPortViewModel _Trochoid; 
public ViewPortViewModel Trochoid 
{ 
    get { return _Trochoid; } 
    set { this.RaiseAndSetIfChanged(ref _Trochoid, value); } 
} 

Các quá tải khác là thực sự không cần thiết bây giờ, nhưng tôi để chúng trong vì loại bỏ chúng là một thay đổi phá vỡ và do đó sẽ không được thực hiện cho đến khi ReactiveUI 5.0

+0

OP đã sử dụng CallerMemberNameAttribute - và thiết lập giá trị bằng cách phản ánh: "Tuy nhiên do phép thuật mà RaiseAndSetIfChanged thực hiện thông qua CallerMemberName" - Tôi đã giả sử họ không muốn thay đổi cách họ sử dụng 'RaiseAndSetIfChanged' . –

+0

Nếu bạn sử dụng quá tải Ref, nó sẽ không làm phản ánh :) –

+0

+ tăng hiệu suất miễn phí –

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