2017-10-06 1 views
13

ReSharper에서는 그것에 대해 나에게 경고 있도록 string.Format가 null이되지 format 인수가 필요합니다 것을 알 수있을만큼 영리하다. 최대한 빨리이 변수에 조건을 추가로 :ReSharper에 사용자 정의 null 체크를 가르 칠 수 있습니까? 단순히 <code>messageFormat</code> 실제로 null이 될 수 <pre><code>_message = string.Format(messageFormat, args); </code></pre> <p></p>을 쓸 때

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

경고가 사라집니다.

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

내 질문은 : 내 확장 방법은 !string.IsNullOrEmpty(messageFormat)와 같은 의미를 가지고 가르쳐 ReSharper에서에 방법이 내가 확장 방법을 사용할 때 Unfortunatelly 그렇지 않습니다?

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

이 일을합니까? ''정적 문자열 EmptyIfNull (이 문자열 s) { return string.IsNullOrEmpty (s)? "": s; }'' ''_message = string.Format (messageFormat.EmptyIfNull(), args);'' – dumetrulo

답변

8

예가 :

확장은 다음과 같이 정의된다. ReSharper의 분석을 안내하기 위해 ReSharper annotations을 사용해야합니다. [CanBeNull]을 이미 사용하고 있으므로 프로젝트에 이미 정의되어 있습니다.

ContractAnnotationAttribute입니다 당신이 관심이있을 것 하나 :

계약 주석이 주어진 입력에 대해 예상되는 출력을 정의하거나 다른 단어에 넣어, 참조 형과 함수의 부울 인수 간의 종속성을 정의 할 수 그 반환 값. 계약 주석의 메커니즘을 사용하면 쉽고 안전하게 사용할 수있는 API를 만들 수 있습니다.

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

인수는 출력 (null, notnull, canbenull, true, false 가능한 입력 (null, notnull, true, false)의지도이다 :

이 당신이 그것을 사용하는 방법입니다 halt) :

다음은 또 다른 예입니다.

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

가 장식 된 함수가 반환하지 (또는 예외를 throw)는 foo 매개 변수 null를 전달할 경우 결코 것을 의미합니다, 당신은 bar에 null이 아닌 값을 전달하는 경우가 null을 반환하지 않습니다 보장합니다.

The documentation은 구문을보다 자세히 설명합니다.


다음은 속성없이 어떻게되는지 : 당신 후에

before

경고 사라져가 추가 :

after

+0

이게 멋지 네요! 이미 'ContractAnnotation'을 여기 저기에 사용하고 있었지만이 경우에도 제대로 작동하는지 몰랐습니다. 나는 또한 'notnull'이 반드시 '사실'을 의미하는 것은 아니기 때문에이 계약이 완전히 올바르지 않다고 생각한다. 어쨌든'notnull'이지만'false' 인'string.Empty'가 될 수 있습니다. – t3chb0t

+0

@ t3chb0t oops, 틀렸어 계약이 잘못 됐어,'null => false'이면 충분 해. –