нулевая цель метода расширения - PullRequest
3 голосов
/ 09 октября 2010
public static IFoo Bar<T>(this IFoo target, ...)
{
   // I'm curious about how useful this check is.
   if (target == null) throw new ArgumentNullException("target");

   ...
}

(1) Приведенный выше код кажется мне странным, потому что я чувствую, что в любом случае вызывающий код будет проверять это. Есть ли какие-то тонкости в методах расширения в этой области, которые применяются?

(2) Существует ли законный образец, который использует тот факт, что цель может быть нулевой? Я спрашиваю об этом из-за удивления, почему вызов метода расширения для нулевой ссылки не сгенерирует исключение времени выполнения так же, как если бы вы вызывали метод экземпляра для нулевой ссылки.

Ответы [ 3 ]

6 голосов
/ 09 октября 2010

Учтите, что null может быть аргументом метода.Также учтите, что метод расширения foo.Bar<int>(); на самом деле является просто синтаксическим сахаром для IFooExtensions.Bar<int>(foo);, и вы увидите, что да, аргумент действительно может быть нулевым, поэтому, если вы что-то делаете с аргументом, это, безусловно, может быть целесообразнымэто для нуля (или просто позвольте NullReferenceException быть брошенным, выбирайте).

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

2 голосов
/ 23 октября 2010

(2) Есть ли законный образец, который использует тот факт, что цель может быть нулевым? Я спрашиваю это как следствие интересно зачем звонить по расширению метод по нулевой ссылке не будет генерировать исключение времени выполнения так же, как если бы вы вызвали экземпляр метод с нулевой ссылкой.

Хорошо, вот одно из его применений.

public static class UtilityExtensions
{
    public static void ThrowIfNull( this object obj, string argName )
    {
        if ( obj == null )
        {
            throw new ArgumentNullException( argName );
        }
    }
}

Теперь вы можете писать пустые проверки легко и в одну строку (полезно, если ваше соглашение о кодировании вынуждает вас использовать скобки со всеми операторами if).

public void Foo(string bar)
{
    bar.ThrowIfNull("bar");
    // ...
}

Независимо от того, считаете ли вы, что «законный» шаблон зависит от вас, но мне было бы очень грустно, если бы среда выполнения была изменена, чтобы вызовы метода расширения для пустых ссылок вызывали исключения.

1 голос
/ 09 октября 2010

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

...