Ответ 1
Методы расширения - это синтаксический сахар языка С#, они скомпилируются в обычные вызовы статических методов в ILCode. Статический метод ничего не знает о параметрах во время компиляции.
Какова точка, позволяющая вызывать методы расширения для нулевых объектов? это заставляет меня необоснованно проверять нулевой объект в методе расширения. AFAIK, я не понимаю этого? Пожалуйста, объясните.
Методы расширения - это синтаксический сахар языка С#, они скомпилируются в обычные вызовы статических методов в ILCode. Статический метод ничего не знает о параметрах во время компиляции.
Проще говоря, почему бы и нет?
Иногда вы можете пропустить тест, если первый метод, который вы вызываете внутри расширения, также выдаст правильную ошибку.
По сути, вы просите, чтобы код был другим, чтобы:
Это похоже на наложение на другие виды использования, чтобы сохранить только одну строку:
if(arg == null)throw new ArgumentNullException();
Методы расширения - это просто синтаксический сахар. В действительности они являются статическими методами для другого класса, поэтому, поскольку вы можете написать
IEnumerable<int> foo = null;
Enumerable.Count(foo);
Вы также можете написать
IEnumerable<int> foo = null;
foo.Count();
Иногда, позволяя вызвать метод расширения для нулевого объекта, упрощается ваш код, позволяя вам перемещать нулевую проверку в методе вместо этого на сайте вызова. Например, у вас может быть метод расширения, который возвращает List<T>
, но если он вызван нулевым объектом, возвращается пустой List<T>
.
NullArgumentException
, может занять время выполнения, и пользователь может захотеть вместо этого утвердить или использовать что-то еще.Методы расширения - это только статические методы:
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
Еще один красивый пример, который не был бы возможен иначе:
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))
....