Зачем допускать методы расширения для нулевых объектов?

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

Ответы

Ответ 1

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

Ответ 2

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

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

По сути, вы просите, чтобы код был другим, чтобы:

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

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

if(arg == null)throw new ArgumentNullException();

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

  • Методы расширения преобразуются в вызовы статического метода, поэтому код все равно должен проверять наличие нулевых аргументов, поскольку нет способа избежать стандартного вызова статического метода без синтаксического сахара расширения.
  • Добавление чего-то вроде проверки, за которым следует NullArgumentException, может занять время выполнения, и пользователь может захотеть вместо этого утвердить или использовать что-то еще.
  • Это сделало бы замену сложнее объяснить или сделать автоматически, поскольку простая замена метода расширения соответствующим вызовом статического метода изменит поведение кода.
  • Есть законный случай, когда вы хотите разрешить нулевые аргументы (например, для конверсий из объектной модели в другую, где нулевой объект одного типа преобразуется в нулевой объект второго типа)

Ответ 6

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

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

Ответ 7

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

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