2012-02-03 89 views
2

我正在制作一些软件,它可以通过我的PC上的COM端口与某些电子设备进行串行通信。我必须与之前没有使用过的SimplicTI协议进行通信。我找到了一个能让我进行沟通的图书馆,但是因为我想以程序员的身份发展,所以我想了解这个图书馆的每一个陈述。在库的源代码,我偶然发现了下面的变量声明:奇怪的C#变量声明

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

这到底是怎么回事?我似乎无法理解这一说法。

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

+1

http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.80).aspx – 2012-02-03 23:42:38

+1

'顺便说一下变量“data”是一个byte.'或byte数组? – 2012-02-03 23:47:39

+0

这是一个字节数组。我编辑过的帖子... – Zahrec 2012-02-03 23:54:24

回答

8

等同于:

byte len; 

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

所以len将是字节数组的长度,对吧? – Zahrec 2012-02-03 23:55:11

+2

是或0,如果字节数组为空。 – Blorgbeard 2012-02-03 23:58:18

1

它使用三元运算符?到位的if声明。它的意思是“如果数据是空集len为0,否则将其设置为data.Lengthdata可能是一个字节数组(byte[]),不byte吧?

+0

噢。 Sry基因。数据是一个字节数组。 – Zahrec 2012-02-03 23:53:12

0

我想你的意思数据byte[]。不管怎么说,它看起来像他们假设data.Length的值不超过byte(0到255),所以他们试图初始化len这个值,这个值是字节缓冲区的长度,以适应data可能为空的可能性。使用三元运算符的单个语句

1

这是“三元”操作者A? B:C

如果A为真则返回乙否则返回Ç这样:

X = A? B:C

意味着

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

通常称为条件运算符或三元运算符。 – Blorgbeard 2012-02-04 00:00:53

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

让我们来剖析这一点。

首先,我们知道我们声明了可变长度,并将其初始化为一个变量:byte len =
接下来,我们有我们的测试。我会删除括号,因为它们是不必要的:data == null
以后,我们如果测试结果是真要返回的值:(byte)0
最后,我们的价值要返回如果测试是假的:(byte)data.Length

让我们将其转换为伪代码: byte len = if(data is null)0,否则数据。长

得更加详细:

如果数据为空,让LEN = 0
否则,让LEN =数据

这就是所谓的 “” 三元运算符的长度。 Is是唯一接受三个参数的运算符:测试,如果为true,则为value-if-false。如果有的话,许多语言都有它,它的语法在语言和语言之间差别不大。从技术上讲,它只是语法糖(一种快捷方式,和字节码等价),用于以下内容: byte len; (data == null) len = 0;如果(data == null) len = 0; } else len = data.Length; }

它可以在变量声明之外使用。例如,我们可以有以下几种: 返回数据== 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,除非它为空,在这种情况下,返回C”。这非常有用 - 不要忘记它!

+0

感谢您花时间写出如此长而有用的回复。 – Zahrec 2012-02-04 02:24:16