Кратчайший способ назначения, только если переменная источника не равна нулю - PullRequest
0 голосов
/ 08 февраля 2019

Я только что прочитал Кратчайший способ проверить нулевое значение и назначить другое значение, если не , но вопрос остается.

Рассмотрим этот часто встречающийся код:

if ( !string.IsNullOrEmpty(source) )
    dest = source;

Это можно выразить как однострочную, используя нуль-коалесцирующий оператор :

dest = source ?? dest;

[Edit:] Спасибо @ Rango за понимание, что они не эквивалентны.Но следующее:

dest = !string.IsNullOrEmpty(source) ? source : dest;

Однако можно предположить, что эта альтернатива не является строго эквивалентной первой (хотя наблюдаемый результат таков).Я говорю "угадай" в этом контексте, потому что я не уверен, будет ли байт-код IL идентичным или нет.

В любом случае, существуют ли более короткие способы не присваивать что-либо, даже исходное значение, переменной dest в случае, когда source равно нулю?Даже если трюк с использованием побитового оператора или что-то более умное.Я действительно надеялся на синтаксис, похожий на нулевой условный оператор .

Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Я давно пользуюсь C #, и, насколько я знаю, ответ - нет.

У вас есть два варианта:

1.) Использованиеесли проверить, чтобы замкнуть логику и пропустить ее, если в этом нет необходимости.Это должно быть самое быстрое для выполнения, в среднем.

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

В конечном счете, проблема сводится к тому, что строки эффективно неизменяемымассивы.Назначения выполняются так же быстро, как и целое число, если строка уже находится в памяти (как это было бы, поскольку вы ссылаетесь на существующие переменные), но проверка на пустое и пустое - это как минимум две проверки (проверка на нулевое значение и проверка длины), которые могутНе следует поддерживать функциональность.Дополнительное назначение в троичной программе - действительно единственная переменная для скорости выполнения (тогда как версия if закорачивает ее, когда она равна нулю).

Так что, несмотря ни на что, вам нужно будет выполнять проверки, ивыполнить назначение, если это необходимо.В конечном счете, я не вижу способа избежать этого, поэтому он не может стать быстрее / короче, чем эти два варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...