2009-04-24 17 views
7

文字列がヌルか空であるかを調べようとするとき、私は通常その文字列を持っています。私は、パラメータを指定せずに動作するようにString.IsNullOrEmpty(などのユーティリティ機能を)期待した理由です:IsNullOrEmptyはStringパラメータを想定しているためパラメータを持たないIsNullOrEmptyオーバーロードメソッドがないのはなぜですか?

String myString; 
bool test=myString.IsNullOrEmpty(); 

しかし、これは、動作しません。代わりに、私は書く必要があります:

String myString; 
bool test=String.IsNullOrEmpty(myString); 

どうしてですか?それは不必要に不器用なようです。もちろん、私はこのための独自の拡張メソッドを簡単に書くことができますが、それは非常に明白な省略のように思われるので、これには正当な理由があるのだろうかと思います。私は、この関数のパラメータのないオーバーロードがちょうどMicrosoftによって忘れられたとは信じられません。

答えて

27

このメソッドは、拡張メソッドをC#に追加された前に、周りの長いされており、拡張メソッドの前に、xyznullだった場合、あなたはまだ呼び出すことができ、このようなxyz.IsNullOrEmpty()としてインスタンスメソッド/プロパティを定義する方法はありませんでした。

+0

良い点ですが、私は今なぜギャップが埋まっていないのか不思議に思います。 –

+10

IsNullOrEmptyはプロパティとして最も快適に実装されるようですが、残念ながら拡張プロパティはありません。 – mquander

27

文字列がnullの場合、IsNullOrEmpty()を呼び出すと、NullReferenceExceptionが返されます。

String test = null; 

test.IsNullOrEmpty(); // Instance method causes NullReferenceException 

ここでは拡張メソッドがあり、これを拡張メソッドで実装して例外を回避することができます。しかし、これは、拡張メソッドは静的メソッドの構文的な砂糖だけではないため、これがうまく動作することを常に心に留めておきます。それだけで構文糖は、このためであるので、この拡張メソッドで

public static class StringExtension 
{ 
    public static Boolean IsNullOrEmpty(this String text) 
    { 
     return String.IsNullOrEmpty(text); 
    } 
} 

はfollwingは

String test = null; 

test.IsNullOrEmpty(); // Extension method causes no NullReferenceException 

例外をスローすることはありません。

StringExtension.IsNullOrEmpty(test); 
5

C#3.0と拡張メソッドの前には、nullオブジェクトでメソッドを呼び出す方法がありませんでした。

3

インスタンスメソッドが存在しない理由は、文字列が実際にnullの場合は、myString.IsNullOrEmptyがスローされるためです。あなたがC#3.0でこれを実現することができ

+0

拡張メソッドとして実装されているわけではありません。なぜなら、私が最初に求めていた理由です。 –

0

public static class StringExtensions 
{ 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 
} 

その後、これは動作します:

test.IsNullOrEmpty(); 

しかし

多くの人がこれに考えることを知っておくことが重要です悪い習慣である。これは、ユーザーの期待に反するためです。注意して使用してください。

+0

これを悪い習慣とみなす理由をもう少し詳しく説明できますか?私はこのようなことを疑っていたので、最初に質問したのですが、なぜクラスの直感的な振る舞いが悪いのかは分かりません。とにかく文法的な砂糖だけなので、私は拡張メソッドが有害になる可能性のある方法を見ていません。 –

2

私は拡張メソッドIsNothingを作成しました。このメソッドは、nullまたは空であるだけでなく、スペースも含んでいるかどうかをチェックします。

public static bool IsNothing(this string source) 
{ 
    if (source == null || source.Length == 0) 
    { 
     return true; 
    } 
    else if (source.Trim().Length == 0) 
    { 
     return true; 
    } 
    return false; 
} 
+0

アイデアありがとう。 – tvanfosson

+0

...それはまだ私の単体テストを渡します! – tvanfosson

0

あなたは、文字列をトリミングだけでなく、多くの場合、私たちのほとんどは、文字列を望んでいないものを追加したい場合がありますあなたの文字列をテストするためにあなたが拡張メソッドやヘルパーメソッドを追加するプロセスである場合タブやスペースなどの空白を持つもの。ここ

は、我々のテストのいずれかの方法

パブリック静的IsTrimStringNullOrEmptyブール(文字列値)
{
       場合(値が== NULL)がtrueを返すあります。
        if(value.Trim()== string.Empty)return true;
        return false;
}

OR

あなたは値をテストしたいとNotNullOrEmpty

のpublic static BOOL IsTrimStringNullOrEmpty(refの文字列値)
{
   場合、それは同時にトリミングされている場合    if(value == null)がtrueを返します。
        value = value.Trim();
        if(value == string.Empty)return true;
        return false;
}

1

それは完全に可能(かつ有効)であるが、これを達成するために拡張メソッドを定義するには、私はそれはオブジェクトのメソッド呼び出しであることをを見えるように、それは、構文的に奇妙に見えることを懸念されるだろうnullになる可能性があります。

YMMVですが、私はString.IsNullOrEmptyに固執します。