Странное C # объявление переменной - PullRequest
2 голосов
/ 04 февраля 2012

Я создаю некоторое программное обеспечение, которое связывается с последовательной связью с некоторыми электронными устройствами через COM-порт на моем ПК. Я должен общаться с протоколом SimplicTI, который я раньше не использовал. Я нашел библиотеку, которая позволяет мне общаться, но так как я хотел бы развиваться как программист, я хотел бы понять каждое утверждение этой библиотеки. В исходном коде библиотеки я наткнулся на следующее объявление переменной:

byte len = (data == null) ? (byte)0 : (byte)data.Length

Что здесь происходит? Я не могу понять это утверждение.

Кстати, переменная data является байтовым массивом.

Ответы [ 6 ]

8 голосов
/ 04 февраля 2012

Эквивалентно:

byte len;

if (data == null)
{
    len = (byte)0;
}
else
{
    len = (byte)data.length;
}
4 голосов
/ 04 февраля 2012

Это пример троичного условного выражения. Проверьте это ТАК сообщение:

Как называется этот код конструкции: условие? true_expression: false_expression

В основном это сокращение для оператора if / else. Если данные нулевые, то len равно 0, иначе len - длина данных.

1 голос
/ 04 февраля 2012
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». Это очень полезно - не забывайте это!

1 голос
/ 04 февраля 2012

Это «троичный» оператор А? B: C

если A истинно, возвращает B, в противном случае возвращает C так:

Х = А? B: C

означает

if (A) {
   X = B
} else {
   X = C
}
1 голос
/ 04 февраля 2012

Используется троичный оператор ? вместо оператора if. Это означает, что «если данные равны нулю, установите len на 0, в противном случае установите его на data.Length. data - это, вероятно, байтовый массив (byte[]), а не byte, верно?

0 голосов
/ 04 февраля 2012

Я думаю, вы имеете в виду данные byte[]. В любом случае, похоже, что они предполагают, что значение data.Length не больше, чем byte (от 0 до 255). Таким образом, они пытаются инициализировать значение len, которое является длиной байтового буфера, учитывая возможность того, что data может быть нулевым, в одном выражении с использованием троичного оператора.

...