编写此方法的最具可读性(和惯用法)是什么?
private bool BytesAreValid(byte[] bytes) {
var t = (bytes[0] | bytes[1] | bytes[2]);
return t != 0;
}
我需要一个函数来测试文件的前三个字节,它不是以00 00 00
开头的。
没有做太多的字节操作。上面的代码对我来说似乎不正确,因为t
是推断类型Int32
。
答案 0 :(得分: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);
这些对我来说都更清楚。
答案 1 :(得分:3)
private bool BytesAreValid(byte[] bytes) {
return !bytes.Take(3).SequenceEqual(new byte[] { 0, 0, 0 });
}
答案 2 :(得分:2)
预测变量数组长度并避免空引用异常:
private bool BytesAreValid(byte[] bytes)
{
if (bytes == null) return false;
return !Array.Exists(bytes, x => x == 0);
}
Non-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;
}