5

このメソッドを書くのに最も読みやすい (そして慣用的な) ものは何ですか?

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

ではないファイルの最初の 3 バイトをテストする関数が必要です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

可変配列の長さを予測し、null 参照の例外を回避するには、次のようにします。

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 に答える