Подтвердить что ты не робот

Метод расширения String.IsNullOrBlank

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

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

Ответ 1

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

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

Это работает, потому что С# позволяет вызывать метод расширения для нулевых экземпляров.

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Немного поздно. Но вы также можете поместить код для исключения исключений в методе расширения. У меня есть два метода (для 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;
}

тесты nunit:

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

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

public void Method(string someStr)
{
    someStr.NullBlankCheckArgument();
    // do something
    var str = someMethod();
    str.NullBlankCheck();
}

Ответ 7

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;
}

Ответ 8

Билл Вагнер в более эффективном С# рекомендует не создавать функции расширения с нулевыми экземплярами (стр. 183).

Причина в том, что методы расширения должны выглядеть как вызовы методов, и вы не можете вызвать метод с экземпляром null.

Ответ 9

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

Ответ 10

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 + "";
    }