Часто экземпляры класса
string приходиться проверять на пустоту или
null используя метод IsNullOrEmpty().
Или, например, такой код:
public void Foo(
string value) {
if (
string.IsNullOrEmpty(value))
throw new ArgumentNullException();
// Проверка для строк состоящих из пробельных символов if (
string.IsNullOrEmpty(value.Trim()))
throw new ArgumentNullException();
// ...}
Однако такую проверку можно заменить на вызов метода экземпляра класса
string.
public static class StringExtensions {
public static bool IsNullOrEmpty(
this string value) {
return string.IsNullOrEmpty(value);
}
public static bool IsNullOrEmptySpace(
this string value) {
return value.IsNullOrEmpty() || value.Trim().IsNullOrEmpty();
}
}
Теперь экземпляры класса
string будут содержать в своем интерфейсе два дополнительных метода.
Однако возникает вопрос, что будет, если мы напишем так:
string value =
null;
value.IsNullOrEmpty();
Оказывается метод вернет
true. Хотя, например, такой код:
string value =
null;
var length = value.Length;
вызовет исключение
NullReferenceException.
Поэтому расширения можно использовать для любых экземпляров класса
string.
Единственный недостаток такого подхода: необходимо везде подлючать пространство имен в котором находиться класс
StringExtensions.
Метод Foo(
string value) преобразуется в:
public void Foo(
string value) {
if (value.IsNullOrEmptySpace(value))
throw new ArgumentNullException();
// ...}