2017-10-06 16 views
13

ReSharper là đủ thông minh để biết rằng một string.Format đòi hỏi một không null format luận nên nó cảnh báo tôi về điều đó khi tôi chỉ đơn giản là viếtTôi có thể dạy ReSharper một kiểm tra null tùy chỉnh không?

_message = string.Format(messageFormat, args); 

nơi messageFormat thực sự có thể được null. Ngay sau khi tôi thêm điều kiện cho biến này:

if (!string.IsNullOrEmpty(messageFormat)) 
{ 
    _message = string.Format(messageFormat, args); 
} 

cảnh báo biến mất. Unfortunatelly nó không khi tôi sử dụng một phương pháp khuyến nông:

if (messageFormat.IsNotNullOrEmpty()) 
{ 
    _message = string.Format(messageFormat, args); // possible 'null' assignment warning 
} 

Câu hỏi của tôi là: là có một cách để dạy ReSharper rằng phương pháp khuyến nông của tôi có ý nghĩa tương tự như !string.IsNullOrEmpty(messageFormat)?

Việc gia hạn được định nghĩa là:

public static bool IsNotNullOrEmpty([CanBeNull] this string value) => !IsNullOrEmpty(value); 
+0

Liệu công việc này? '' chuỗi tĩnh EmptyIfNull (chuỗi này) { chuỗi trả về.IsNullOrEmpty (s)? "": s; } '' rồi '' _message = string.Format (messageFormat.EmptyIfNull(), args); '' – dumetrulo

Trả lời

8

Có có. Bạn cần sử dụng số ReSharper annotations để hướng dẫn phân tích của ReSharper. Bạn đã sử dụng [CanBeNull] để chúng đã được xác định trong dự án của bạn.

Một bạn sẽ quan tâm đến là ContractAnnotationAttribute:

chú thích Hợp đồng cho phép bạn xác định kết quả đầu ra dự kiến ​​cho các đầu vào nhất định, hoặc đưa vào Nói cách khác, xác định phụ thuộc giữa các loại tài liệu tham khảo và đối số boolean của một hàm và giá trị trả về của nó. Cơ chế chú thích hợp đồng cho phép tạo các API có thể được tiêu thụ theo cách dễ dàng và an toàn hơn.

Đây là cách bạn sử dụng nó:

[ContractAnnotation("null => false")] 
public static bool IsNotNullOrEmpty(this string value) 
    => !string.IsNullOrEmpty(value); 

Đối số là một bản đồ đầu vào có thể (null, notnull, true, false) để kết quả đầu ra (null, notnull, canbenull, true, false, halt):

Đây là một ví dụ khác:

[ContractAnnotation("foo: null => halt; bar: notnull => notnull")] 
public string Frob(string foo, string bar) 

Có nghĩa là chức năng trang trí sẽ không bao giờ quay trở lại (hoặc ném một ngoại lệ) nếu bạn vượt qua nó null tới tham số foo, và đảm bảo rằng nó sẽ không trở lại null nếu bạn vượt qua một giá trị khác null để bar.

The documentation mô tả cú pháp chi tiết hơn.


Đây là những gì xảy ra mà không thuộc tính:

dissapears

before

Cảnh báo sau khi bạn thêm nó:

after

+0

Điều này có vẻ tuyệt vời! Tôi đã sử dụng 'ContractAnnotation's ở đây và đã có nhưng tôi không biết nó sẽ làm việc cho trường hợp này quá. Tôi cũng nghĩ rằng hợp đồng này không hoàn toàn chính xác như 'notnull' không nhất thiết có nghĩa là 'true'. Nó có thể là 'string.Empty' là' notnull' nhưng 'false'. – t3chb0t

+0

@ t3chb0t oops, bạn chính xác, hợp đồng là sai, 'null => false' là đủ –

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