5

编写此方法最易读(和惯用)的是什么?

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

我需要一个函数来测试文件的前三个字节不是以00 00 00.

没有做太多的字节操作。上面的代码对我来说似乎不正确,因为t推断为 type Int32

4

3 回答 3

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);

这两个对我来说似乎更清楚。

于 2013-02-28T19:33:57.463 回答
3
private bool BytesAreValid(byte[] bytes) {
    return !bytes.Take(3).SequenceEqual(new byte[] { 0, 0, 0 });
}
于 2013-02-28T20:21:54.827 回答
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;
}
于 2013-02-28T19:57:46.673 回答