Чтобы ответить на ваш актуальный вопрос: опыт и привычка.
До включения ключевого слова as
в .Net 2.0 единственным способом безопасно определить, можно ли привести объект к определенному типу / интерфейсу, было ключевое слово is
.
Итак, люди привыкли использовать is
перед попыткой явного приведения во избежание ненужных исключений.Это привело к тому, что у вас второй шаблон в вашем списке образцов:
if(whatever is IDisposable) //check
{
((IDisposable)whatever).Dispose(); //cast - won't fail
}
Затем мы получили ключевое слово as
safe-cast.Я предполагаю, что большинство людей, когда они впервые начали использовать as
, продолжали использовать знакомый шаблон, но заменили прямое приведение на безопасное приведение, и их шаблон выбора трансформировался в ваш пример 1. (Я знаю, что сделалэто ненадолго.)
if(whatever is IDisposable)
{
(whatever as IDisposable).Dispose();
}
В конце концов, многие или большинство либо осознали сами, либо получили инструкции от fxCop или CodeAnalysis, что «правильный» шаблон - ваш пример 3:
IDisposable whateverDisposable = whatever as IDisposable;
if(whateverDisposable != null )
{
whateverDisposable.Dispose();
}
Конечно, есть некоторые, кто еще находится на стадии примера 1 и по какой-то причине еще не «развил» свой паттерн до вашего примера 3, или другие, которые все еще просто используют старый добрый проверенный временем паттерниспользуя is
с последующим прямым приведением.