14

文字列フィールドを継続的にチェックして、nullまたは空白かどうかを確認します。

if(myString == null || myString.Trim().Length == 0)
{
    throw new ArgumentException("Blank strings cannot be handled.");
}

少し入力する手間を省くために、同じ効果を持つStringクラスの拡張メソッドを作成することは可能ですか?クラスインスタンスに拡張メソッドを追加する方法を理解していますが、静的拡張メソッドをクラスに追加するのはどうですか?

if(String.IsNullOrBlank(myString))
{
    throw new ArgumentException("Blank strings cannot be handled.");
}
4

10 に答える 10

36

あなたがすることができます:

public static bool IsNullOrBlank(this String text)
{
  return text==null || text.Trim().Length==0;
}

そして、次のように呼び出します。

if(myString.IsNullOrBlank())
{
  throw new ArgumentException("Blank strings cannot be handled.");
}

これが機能するのは、C# ではnullインスタンスで拡張メソッドを呼び出すことができるためです。

于 2009-03-15T11:24:25.193 に答える
17

私はこれが古い質問であることを知っていますが、それはぶつかり、まだ言及されていないので、.NET 4.0 の時点では、単純にString.IsNullOrWhiteSpace メソッドを使用して同じ結果を得ることができます。

于 2010-11-08T22:29:16.207 に答える
6

インスタンスで拡張メソッドを安全に使用できます。

public static class StringExtensions
{
    public static bool IsNullOrBlank(this string s)
    {
        return s == null || s.Trim().Length == 0;
    }
}

テストケース:

string s = null;
Assert.IsTrue(s.IsNullOrBlank());
s = " ";
Assert.IsTrue(s.IsNullOrBlank());

少し奇妙に見えますが、代わりに、このケースで文字列を頻繁にチェックする必要がある理由を理解します。ソースでそれらを修正すれば、後でそれらについてそれほど偏執的になる必要はありません!

于 2009-03-15T11:26:21.990 に答える
2

既存のクラスに静的メソッドを追加できますか?答えはノーです。最初に入力するクラス名を知る必要があるため、値はかなり薄くなります。拡張メソッドの利点は、変数名から始めて、オートコンプリートがそれに適用できるものを表示することです。

よくあるもう1つのポイントは、拡張メソッドは、最初の引数がnullの場合、常にできるだけ早く例外をスローする必要があるということです。ただし、メソッドの名前にをチェックするように設計されていると記載されている場合、ルールはやり過ぎだと思いますnull

あなたが抱えている本当の問題は、null参照をチェックした後、コードをきちんと読みやすく実行したいということです。そのパターンをキャプチャする1つの方法は、この質問に対する私の答えにあります。

于 2009-03-15T11:15:10.363 に答える
1
public static bool IsNullOrEmptyTrimmed(string value)
{
    return (value == null || value.Length == 0) ?
        true : value.Trim().Length == 0;
}

また

public static bool IsNullOrEmpty(this String value, bool checkTrimmed)
{
    var b = String.IsNullOrEmpty(value);
    return checkTrimmed ? (b && value.Trim().Length > 0) : b;
}
于 2009-03-15T12:27:47.147 に答える
0

いくつかのトリックを使用して、任意の1つのcsファイルのStringクラスに追加したように見せます。

namespace JDanielSmith
{
    public static class String
    {
        public static bool IsNullOrBlank(string text)
        {
            return text == null || text.Trim().Length == 0;
        }
    }
}

(これは拡張メソッドではないことに注意してください。私のコメントを参照してください)。

次に、他のCSファイルで:

using String = JDanielSmith.String;
namespace Foo.Bar.Baz
{
    class Program
    {
        static void test(string myString)
        {
            if (String.IsNullOrBlank(myString))
            {
                throw new ArgumentException("Blank strings cannot be handled.");
            }
        }
...

String.IsNullOrBlank()の「望ましい」構文に注意してください。私は必ずしもあなたが実際にこのように物事を行うことを示唆しているわけではなく、コードを機能させるために物事をどのように設定できるかを指摘しているだけです。

于 2009-03-15T23:39:15.287 に答える
-1
public static bool IsNull(this object o)
{
    return string.IsNullOrEmpty(o.ToStr());
}

public static bool IsNotNull(this object o)
{
    return !string.IsNullOrEmpty(o.ToStr());
}

public static string ToStr(this object o)
{
    return o + "";
}
于 2009-03-15T12:01:36.447 に答える