byte len = (data == null) ? (byte)0 : (byte)data.Length
Давайте рассмотрим это.
Сначала мы знаем, что объявляем переменную длину и инициализируем ее переменной: byte len =
Далее у нас есть наш тест. Я уберу скобки, так как они не нужны: data == null
Тогда у нас есть значение, которое будет возвращено, если тест верен: (byte)0
Наконец, у нас есть значение, которое будет возвращено, если тест ложен: (byte)data.Length
Давайте преобразуем его в псевдокод:
байт len = if (данные нулевые) 0, иначе data.Length
Чтобы быть более многословным:
Если данные нулевые, пусть len = 0
В противном случае пусть len = длина данных
Это называется "троичным оператором". Is является единственным оператором, который принимает три аргумента: test, value-if-true и value-if-false. Он есть во многих языках, и его синтаксис не сильно отличается от языка к языку, если вообще существует.
Технически, это просто синтаксический сахар (ярлык и эквивалент байт-кода) для следующего:
байт лен;
if (data == null)
{
len = 0;
}
еще
{
len = data.Length;
}
Может использоваться вне объявлений переменных. Например, мы могли бы иметь следующее:
вернуть данные == ноль? 0: данные. Длина;
Некоторые программисты считают использование троичного оператора плохой практикой программирования из-за проблем с читабельностью. Лично я часто нахожу альтернативу слишком многословной и менее читаемой.
Стоит отметить, что C # идет дальше и даже имеет синтаксический сахар для своего синтаксического сахара. Следующие три фрагмента кода эквивалентны:
// Most verbose method:
object a;
if (b == null)
{
a = c;
}
else
{
a = b;
}
// Significantly less verbose:
object a = b == null ? c : b;
// Now this is just plain awesome:
object a = b ?? c;
Этот последний оператор означает «вернуть b, если он не равен нулю, в этом случае вернуть c». Это очень полезно - не забывайте это!