编写此方法的最可读性(和惯用)是什么?检查字节是否为0x00
private bool BytesAreValid(byte[] bytes) {
var t = (bytes[0] | bytes[1] | bytes[2]);
return t != 0;
}
我需要在此进行测试的前三个字节,它不是与00 00 00
开始文件的功能。
没有做太多的字节操作。上面的代码对我来说似乎不正确,因为t
被推断为Int32
。
编写此方法的最可读性(和惯用)是什么?检查字节是否为0x00
private bool BytesAreValid(byte[] bytes) {
var t = (bytes[0] | bytes[1] | bytes[2]);
return t != 0;
}
我需要在此进行测试的前三个字节,它不是与00 00 00
开始文件的功能。
没有做太多的字节操作。上面的代码对我来说似乎不正确,因为t
被推断为Int32
。
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并回答。 – BuddyJoe 2013-02-28 19:37:24
为了预测变量数组的长度,避免空引用异常:
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',那么返回'false'? – 2013-02-28 20:01:21
是的,如果数组包含一个等于零的值或数组为null,则返回false(无效)。 – Tim 2013-02-28 20:11:49
你不介意在后一个取代“最佳途径” “最易读”/“最紧凑的代码”/“最快的代码”或任何其他明确定义的“更好”的标准? (考虑在你阅读时从标题中删除标签)。 – 2013-02-28 19:44:52
+1 - 好主意 – BuddyJoe 2013-02-28 19:47:14