2017-10-06 8 views
13

ReSharper bu konuda beni uyardı böylece string.Format bir boş değil format bağımsız değişken gerektirir bilecek kadar zeki. Bu değişken için bir koşul eklediğimde, uyarı kayboluyor.ReSharper'a özel bir boş kontrol öğretebilir miyim? Ben sadece <code>messageFormat</code> gerçekten boş olabilir <pre><code>_message = string.Format(messageFormat, args); </code></pre> <p></p> yazarken

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

Sorum şu: Uzantımın yöntemi !string.IsNullOrEmpty(messageFormat) aynı anlama sahiptir öğretme ReSharper bir yolu yoktur ben bir uzantısı yöntemi kullandığınızda Maalesef değil mi?

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

bu çalışır mı? '' statik dizi BoşIfNull (bu dize s) { dönüş dizesi.IsNullOrEmpty (s)? "": s; } '' sonra '' _message = string.Format (messageFormat.EmptyIfNull(), args); '' – dumetrulo

cevap

8

Evet vardır:

uzatma olarak tanımlanır. ReSharper'ın analizini yönlendirmek için ReSharper annotations'u kullanmanız gerekir. Zaten projenizde zaten tanımlanmış olan [CanBeNull] kullanıyorsunuz.

ContractAnnotationAttribute olduğu ilgileniyorsunuz olacak tek:

Sözleşme Açıklamalarda Sağlanan girişler için beklenen çıktılar tanımlamak veya başka bir deyişle söylemek gerekirse, referans tipi ve bir fonksiyonun boole argümanlar arasındaki bağımlılıkları tanımlayalım dönüş değeri. Sözleşme ek açıklamalarının mekanizması daha kolay ve daha güvenli bir şekilde tüketilebilecek API'lerin oluşturulmasına izin verir.

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

argüman çıkışları (null, notnull, canbenull, true, false mümkün girdiler (null, notnull, true, false) bir haritası,:

Bu Kullanmaya nasıl halt):

İşte başka bir örnek:

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

dekore işlevi dönmek (veya bir istisna) Eğer foo parametreye null geçmek durumunda asla Means ve bar için boş olmayan bir değer geçirirseniz o null geri dönmeyecek garanti eder. Sözdizimi

The documentation, sözdizimini daha ayrıntılı olarak açıklar.


İşte özniteliği olmadan gerçekleşir: senden sonra

before

uyarı dissapears ekleyin:

after

+0

Bu harika görünüyor! Ben burada ContractAnnotation kullanıyorum ve zaten orada ama bu durum için de işe yarayacağını bilmiyordum. Ayrıca bu sözleşmenin tamamen doğru olmadığını düşünüyorum, çünkü “gerçek”, “doğru” anlamına gelmez. Yine de "değil", yani "yanlış" olan "string.Empty" olabilir. – t3chb0t

+0

@ t3chb0t oops, haklısınız, sözleşme yanlış, 'null => false' yeterli –

İlgili konular