2013-02-28 87 views
5

編寫此方法的最可讀性(和慣用)是什麼?檢查字節是否爲0x00

private bool BytesAreValid(byte[] bytes) { 
    var t = (bytes[0] | bytes[1] | bytes[2]); 
    return t != 0; 
} 

我需要在此進行測試的前三個字節,它不是與00 00 00開始文件的功能。

沒有做太多的字節操作。上面的代碼對我來說似乎不正確,因爲t被推斷爲Int32

+1

你不介意在後一個取代「最佳途徑」 「最易讀」/「最緊湊的代碼」/「最快的代碼」或任何其他明確定義的「更好」的標準? (考慮在你閱讀時從標題中刪除標籤)。 – 2013-02-28 19:44:52

+0

+1 - 好主意 – BuddyJoe 2013-02-28 19:47:14

回答

14

t是類型推斷爲一個Int32

燁,因爲操作者|(像大多數運營商)爲byte沒有定義 - 字節被晉升爲int值。 (有關詳細信息,請參閱C#4規範的第7.11.1節。)

但是,考慮到您只想將其與0進行比較,無論如何這很好。

個人而言,我只希望把它寫成:

return bytes[0] != 0 && bytes[1] != 0 && bytes[2] != 0; 

甚至:

return (bytes[0] != 0) && (bytes[1] != 0) && (bytes[2] != 0); 

這兩個似乎更清楚我。

+0

知道有一個更好的方法來清理。謝謝。 +1並回答。 – BuddyJoe 2013-02-28 19:37:24

2

爲了預測變量數組的長度,避免空引用異常:

private bool BytesAreValid(byte[] bytes) 
{ 
    if (bytes == null) return false; 

    return !Array.Exists(bytes, x => x == 0); 
} 

非LINQ的版本:

private bool BytesAreValid(byte[] bytes) 
{ 
    if (bytes == null) return false; 

    for (int i = 0; i < bytes.Length; i++) 
    { 
     if (bytes[i] == 0) return false; 
    } 
    return true; 
} 
+0

因此,如果存在任何'0',那麼返回'false'? – 2013-02-28 20:01:21

+0

是的,如果數組包含一個等於零的值或數組爲null,則返回false(無效)。 – Tim 2013-02-28 20:11:49

3
private bool BytesAreValid(byte[] bytes) { 
    return !bytes.Take(3).SequenceEqual(new byte[] { 0, 0, 0 }); 
} 
+2

或類似'bytes.Take(3).Any(b => b!= 0);' – erikH 2013-02-28 22:16:19

+0

更好。謝謝! – 2013-02-28 23:17:29

+0

令人敬畏的技術。 +1 – BuddyJoe 2013-02-28 23:27:58