какой смысл разрешать вызов методов расширения для нулевых объектов? это заставляет меня без необходимости проверять нулевой объект в методе расширения. AFAIK, я не могу понять это? Пожалуйста, объясни.
зачем разрешать методы расширения для нулевых объектов?
Ответы (7)
Методы расширения — это синтаксический сахар языка C#, они компилируются в обычные вызовы статических методов в ILCode. Статический метод ничего не знает о параметрах во время компиляции.
Проще говоря, почему бы и нет?
Иногда вы можете пропустить тест, если первый метод, который вы вызываете в расширении, также выдает правильную ошибку.
По сути, вы просите, чтобы код был другим, чтобы:
- Использование, которое является разумным для нулевого объекта, становится запрещенным.
- Использование, которое не требует нулевой проверки (поскольку она подразумевается в чем-то другом), получает накладные расходы на ненужную проверку, которую вы хотите выполнять автоматически.
Это кажется большим наложением на другие виды использования только для того, чтобы сохранить одну строку:
if(arg == null)throw new ArgumentNullException();
ArgumentNullException
, так как в ILCode нет такого понятия, как метод расширения. Методы расширения — это просто статические методы, поэтому ArgumentNullException
более подходит.
- person Femaref; 28.03.2011
ArgumentNullException
.
- person Femaref; 28.03.2011
ArgumentNullException
во многом на том основании, о котором вы и Ден спорили (если, конечно, я не мог просто сделать что-то значимое с null
).
- person Jon Hanna; 28.07.2015
Методы расширения — это просто синтаксический сахар. На самом деле это статические методы другого класса, поэтому, поскольку вы можете написать
IEnumerable<int> foo = null;
Enumerable.Count(foo);
Вы также можете написать
IEnumerable<int> foo = null;
foo.Count();
ArgumentNullException
. Count
не позволяет параметру source быть нулевым: msdn.microsoft.com/en-us/library/vstudio/bb338038.aspx
- person Yves M.; 03.10.2013
Иногда разрешение вызова метода расширения для нулевого объекта упрощает ваш код, позволяя переместить проверку нулевого значения в метод, а не в место вызова. Например, у вас может быть метод расширения, который возвращает List<T>
, но при вызове для нулевого объекта возвращает пустой List<T>
.
- Методы расширения преобразуются в вызовы статических методов, поэтому код все равно должен будет проверять аргументы null, поскольку нет никакого способа избежать нормального вызова статического метода без синтаксического сахара метода расширения.
- Добавление чего-то вроде проверки, за которой следует
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))
....
Image img = ((Image)null).FromBytes(File.ReadAllBytes(file))
вместо статического вспомогательного классаImageUtility
. - person BrunoLM   schedule 28.03.2011myStringVar.IsNullOrEmpty()
. - person Daniel Hilgarth   schedule 28.03.2011close
? - person Srinivas Reddy Thatiparthy   schedule 28.03.2011