Предположим, что вы используете тернарный оператор или оператор нулевого коалесцирования или вложенные операторы if-else для выбора назначения объекту. Теперь предположим, что в условном выражении вы оцениваете дорогостоящую или неустойчивую операцию, требуя, чтобы вы поместили результат во временную переменную, захватив ее состояние, чтобы ее можно было сравнить, а затем потенциально присвоить.
Как бы язык, например С#, для рассмотрения, реализовать новый логический оператор для обработки этого случая? Должно ли это? Существуют ли существующие способы обработки этого случая в С#? Другие языки?
Некоторые случаи сокращения многословия тройного или нулевого коалесцирующего оператора были преодолены, если предположить, что мы ищем прямые сравнения. См. Уникальные способы использования оператора Null Coalescing, в частности обсуждение того, как можно расширить использование оператора для поддержки String.IsNullOrEmpty(string)
. Обратите внимание, что Jon Skeet использует PartialComparer
из MiscUtil
, чтобы переформатировать 0
в null
s,
Почему это возможно? Посмотрите, как мы пишем метод сравнения для сложных объектов без каких-либо ярлыков (примеры из приведенных обсуждений):
public static int Compare( Person p1, Person p2 )
{
return ( (result = Compare( p1.Age, p2.Age )) != 0 ) ? result
: ( (result = Compare( p1.Name, p2.Name )) != 0 ) ? result
: Compare( p1.Salary, p2.Salary );
}
Джон Скит пишет новое сравнение, чтобы отменить случай равенства. Это позволяет выразить выражение путем записи нового конкретного метода, который возвращает null, что позволяет нам использовать нулевой оператор коалесцирования:
return PartialComparer.Compare(p1.Age, p2.Age)
?? PartialComparer.Compare(p1.Name, p2.Name)
?? PartialComparer.Compare(p1.Salary, p2.Salary)
?? 0;
Оператор нулевого коалесцирования более читабельен, поскольку имеет две стороны, а не три. Условие boolean condition разделяется на метод, в этом случае возвращающий null
, если выражение должно быть продолжено.
Как бы выглядело выражение выше, если бы мы могли легко поставить условие в строку? Возьмите выражение из PartialComparer.Compare
, которое возвращает null
, и поместите его в новое тернарное выражение, которое позволяет нам использовать оценку левого выражения с неявной временной переменной value
:
return Compare( p1.Age, p2.Age ) unless value == 0
: Compare( p1.Name, p2.Name ) unless value == 0
: Compare( p1.Salary, p2.Salary );
Основным "потоком" выражения будет:
выражение A, если только boolean B, и в этом случае выражение C
Вместо того, чтобы быть перегруженным оператором сравнения, я полагаю, что это больше похоже на короткозамкнутый инвертированный тернарный оператор.
- Будет ли этот тип логики полезен? В настоящее время нулевое коалесцирование дает нам способ сделать это с условным выражением
(value == null)
. - Какие еще выражения вы бы хотели протестировать? Мы слышали о
(String.IsNullOrEmpty(value))
. - Каким будет лучший способ выразить это на языке, с точки зрения операторов, ключевых слов?