我正在制作一些软件,通过我PC上的COM端口与某些电子设备进行串行通信。我必须与之前没有使用的SimplicTI协议进行通信。我找到了一个可以让我进行交流的库,但是由于我想成为一名程序员,我想了解这个库的每一个语句。在库的源代码中,我偶然发现了以下变量声明:
byte len = (data == null) ? (byte)0 : (byte)data.Length
这里发生了什么?我似乎无法掌握这一说法。
顺便说一下变量“data”是一个字节数组。
答案 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.Length
。data
可能是字节数组(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
可能为空的可能性。