2012-02-03 86 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