Я натолкнулся на это сообщение в блоге сегодня.
Я подведу итоги. Блоггер комментирует этот код и говорит, что он уродлив.
// var line1 = person.Address.Lines.Line1 ?? string.Empty;
// throws NullReferenceException:
// {"Object reference not set to an instance of an object."}
// The ugly alternative
var line1 = person.Address == null
? "n/a"
: person.Address.Lines == null
? "n/a"
: person.Address.Lines.Line1;
Затем блоггер пишет класс, который позволяет заменить приведенный выше код новым синтаксисом.
var line2 = Dis.OrDat<string>(() => person.Address.Lines.Line2, "n/a");
Код для класса Dis выглядит следующим образом.
public static class Dis
{
public static T OrDat<T>(Expression<Func<T>> expr, T dat)
{
try
{
var func = expr.Compile();
var result = func.Invoke();
return result ?? dat; //now we can coalesce
}
catch (NullReferenceException)
{
return dat;
}
}
}
Итак, первый вопрос, который у меня возникает, - почему исходный код, содержащий ??
, должен быть заменен на проклятый код ?:
.
Мой второй вопрос: зачем использовать дерево выражений над Null Coalesce? Единственная причина, по которой я могу думать об этом, заключается в том, что они используют ленивую инициализацию, но это не ясно из поста и не ясно из тестового кода, который находится в посте блога. Я также опубликую это здесь.
Кстати, кто-нибудь знает, как создать окно кодового блока фиксированного размера? Или здесь предпочтительней кодовый блок без прокрутки? Я ничего не видел в Мета блоге.