Метод расширения String.IsNullOrBlank - PullRequest
14 голосов
/ 15 марта 2009

Я постоянно проверяю строковые поля, чтобы проверить, являются ли они пустыми или пустыми.

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.");
}

Ответы [ 9 ]

36 голосов
/ 15 марта 2009

Вы можете сделать:

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 экземпляров.

16 голосов
/ 09 ноября 2010

Я знаю, что это старый вопрос, но, поскольку он был затронут и не упоминался ранее, в .NET 4.0 можно просто использовать метод String.IsNullOrWhiteSpace для достижения того же результата.

6 голосов
/ 15 марта 2009

Вы можете безопасно использовать метод расширения в экземпляре:

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());

Хотя это выглядит немного странно, и я бы вместо этого выяснил, почему ваши строки нужно так часто проверять для этого случая. Если вы исправите их в источнике, вам не придется быть таким параноиком позже!

2 голосов
/ 08 августа 2009

Перегрузка на существующие ответы может быть:

public static bool IsNullOrBlank(this String text, Action<String> doWhat)
{
  if (text!=null && text.Trim().Length>0)
    doWhat(text);
}

Было бы полезно, если вы хотите запускать код только с допустимым значением.

Не очень полезный пример, но просто показывает использование:

Name.IsNullOrBlank(name=>Console.WriteLine(name));
2 голосов
/ 15 марта 2009

Можете ли вы добавить статические методы к существующим классам? Ответ - нет, и значение будет довольно тонким, потому что вам все равно нужно будет знать, какое имя класса набирать первым; с помощью методов расширения преимущество состоит в том, что вы начинаете с имени переменной, а автозаполнение показывает вам, что к ней применимо.

Другой часто упоминаемый момент заключается в том, что методы расширения всегда должны генерировать исключение как можно скорее, если их первый аргумент равен нулю. Тем не менее, я думаю, что это правило излишне, если метод упоминает в своем названии, что он предназначен для проверки на null.

Настоящая проблема, с которой вы столкнулись, заключается в том, что вы хотите аккуратно и легко выполнить какой-то код после проверки нулевой ссылки. Один из способов уловить этот паттерн - мой ответ на этот вопрос .

1 голос
/ 24 мая 2013

Немного поздно. Но вы также можете поместить код для выдачи исключения в метод расширения. У меня есть два метода (для ArgumentNullException и NullReferenceException).

// strings
public static bool NullBlankCheck(this string s, string message = "",
    bool throwEx = true)
{
    return Check<NullReferenceException>(s.IsNullOrBlank(), throwEx, message);
}
public static bool NullBlankCheckArgument(this string s, string message = "",
    bool throwEx = true)
{
    return Check<ArgumentException>(s.IsNullOrBlank(), throwEx, message);
}

private static bool Check<T>(bool isNull, bool throwEx, string exceptionMessage)
    where T : Exception
{
    if (throwEx && isNull)
        throw Activator.CreateInstance(typeof(T), exceptionMessage) as Exception;
    return isNull;
}

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

тесты моноблоков:

Assert.Throws<NullReferenceException>(() =>
{
    "".NullEmptyCheck();
});
Assert.Throws<ArgumentException>(() =>
{
    "".NullEmptyCheckArgument();
});

А затем используйте его как:

public void Method(string someStr)
{
    someStr.NullBlankCheckArgument();
    // do something
    var str = someMethod();
    str.NullBlankCheck();
}
0 голосов
/ 16 марта 2009

С помощью нескольких трюков вы получите вид, что вы добавили класс String в любой файл cs :

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 () . Я не обязательно предполагаю, что вы действительно делаете это таким образом, просто указываю, как вы можете настроить все, чтобы ваш код работал.

0 голосов
/ 15 марта 2009
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;
}
0 голосов
/ 15 марта 2009
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 + "";
}
...