怪异的C#声明变量

时间:2012-02-03 23:40:27

标签: c# variables declaration conditional-operator

我正在制作一些软件,通​​过我PC上的COM端口与某些电子设备进行串行通信。我必须与之前没有使用的SimplicTI协议进行通信。我找到了一个可以让我进行交流的库,但是由于我想成为一名程序员,我想了解这个库的每一个语句。在库的源代码中,我偶然发现了以下变量声明:

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

这里发生了什么?我似乎无法掌握这一说法。

顺便说一下变量“data”是一个字节数组。

6 个答案:

答案 0 :(得分:8)

相当于:

byte len;

if (data == null)
{
    len = (byte)0;
}
else
{
    len = (byte)data.length;
}

答案 1 :(得分:4)

这是三元条件表达式的示例。看看这篇SO帖子:

What is the name of this code construction: condition ? true_expression: false_expression

基本上是if / else语句的简写。如果data为null,则len为0,否则len为数据的长度。

答案 2 :(得分:1)

它使用三元运算符?代替if语句。这意味着“如果数据为空集len为0,否则将其设置为data.Lengthdata可能是字节数组(byte[]),而不是byte ,对吗?

答案 3 :(得分:1)

这是“三元”运算符A? B:C

如果A为真,则返回B,否则返回C,所以:

X = A? B:C

表示

if (A) {
   X = B
} else {
   X = C
}

答案 4 :(得分:1)

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

让我们剖析一下。

首先,我们知道我们正在声明变量长度,并将其初始化为变量:byte len =
接下来,我们进行测试。我将删除括号,因为它们是不必要的:data == null
然后,如果测试结果为真,我们将返回值:(byte)0
最后,如果测试结果为false,则返回值:(byte)data.Length

让我们将其转换为伪代码:     byte len = if(data为null)0,否则data.Length

更详细:

  

如果data为null,则让len = 0
  否则,让len =数据长度

这被称为“三元”运算符。是唯一带有三个参数的运算符:test,value-if-true和value-if-false。许多语言都有它,它的语法在语言和语言之间的差别很大,如果有的话。

从技术上讲,它只是以下语法糖(快捷方式和字节码等效):     字节len;     if(data == null)     {          len = 0;     }     其他     {          len = data.Length;     }

它可以在变量声明之外使用。例如,我们可以有以下内容:     return data == null? 0:data.Length;

由于可读性问题,一些程序员认为使用三元运算符是一种糟糕的编程习惯。就个人而言,我经常发现其替代方案过于冗长且不易阅读。

值得注意的是,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,除非它为null,在这种情况下,返回c”。这非常有用 - 别忘了!

答案 5 :(得分:0)

我认为你的意思是数据是byte[]。无论如何,看起来他们假设data.Length的值不超过byte(0到255)。因此,他们正在尝试初始化值len,这是字节缓冲区的长度,在使用三元运算符的单个语句中容纳data可能为空的可能性。