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