зачем разрешать методы расширения для нулевых объектов? - PullRequest
16 голосов
/ 28 марта 2011

Какой смысл разрешать вызов методов расширения для нулевых объектов?это заставляет меня без необходимости проверять наличие нулевого объекта в методе расширения.AFAIK, я не могу этого понять?Пожалуйста, объясните.

Ответы [ 7 ]

31 голосов
/ 28 марта 2011

Методы расширения являются синтаксическим сахаром языка C #, они компилируются в обычные статические вызовы методов в ILCode.Статический метод ничего не знает о параметрах во время компиляции.

16 голосов
/ 28 марта 2011

Проще говоря, почему бы и нет?

Вы можете иногда пропустить тест, если первый метод, который вы вызываете в расширении, также выдаст правильную ошибку.

По сути, вы запрашиваетекод должен отличаться, так что:

  1. Использование, которое является разумным для нулевого объекта, становится недопустимым.
  2. Использование, которое не нуждается в проверке на ноль (потому что это подразумевается в чем-то другом) получить накладные расходы на ненужную проверку, которую вы хотите выполнить автоматически.

Это, похоже, навязывает другие виды использования только для сохранения одной строки:

if(arg == null)throw new ArgumentNullException();
8 голосов
/ 28 марта 2011

Методы расширения - просто синтаксический сахар.В действительности они являются статическими методами в другом классе, так что вы можете написать

IEnumerable<int> foo = null;
Enumerable.Count(foo);

Вы также можете написать

IEnumerable<int> foo = null;
foo.Count();
2 голосов
/ 16 января 2012

Иногда разрешение вызова метода расширения для нулевого объекта упрощает ваш код, позволяя перенести нулевую проверку в метод, а не на сайт вызова. Например, у вас может быть метод расширения, который возвращает List<T>, но при вызове для нулевого объекта возвращает пустой List<T>.

1 голос
/ 15 июня 2015

Еще один прекрасный пример, который иначе был бы невозможен:

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

Так что вы можете использовать

string s = null;
if (s.IsNullOrEmpty()) // no null reference error!
    ...

Вместо

string s = null;
if (string.IsNullOrEmpty(s))
    ....
1 голос
/ 28 марта 2011

Методы расширения - это просто статические методы:

List<int> x = null;
x.Count()

Эквивалентно:

List<int> x = null;
System.Linq.EnumerableExtensions.Count(x); 
//EnumerableExtensions may not be the class, but you get the idea
1 голос
/ 28 марта 2011
  1. Методы расширения преобразуются в вызовы статических методов, поэтому код все равно должен будет проверять наличие нулевых аргументов, поскольку невозможно избежать нормального вызова статического метода без синтаксического сахара метода расширения.
  2. Добавление чего-то вроде проверки, сопровождаемой NullArgumentException, может занять время выполнения, и пользователь может захотеть вместо этого утверждать или использовать что-то еще.
  3. Это сделает замену более сложной для объяснения или выполнения автоматически, так какпростая замена метода расширения соответствующим статическим вызовом метода изменит поведение кода.
  4. Есть законный случай, когда вы хотите разрешить нулевые аргументы (для примера преобразования из объектной модели в другую, где нулевая)объект одного типа преобразуется в нулевой объект второго типа)
...