1
public static readonly byte[] TestArray=
    new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };

public bool TestFunction() 
{
    MemoryStream s=new MemoryStream(
        new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d }
        );

    byte[] test=s.ToArray();
    return (test==TestArray);
}

我正在使用上面的简单代码。数组中的字节值相等。但我的TestFunction()总是返回假。到底是怎么回事?

4

8 回答 8

7

因为数组是 .Net 中的引用类型,对于数组,==操作符只是检查它们是否是对内存中相同对象的引用。您需要SequenceEqual使用它来比较每个字节:

test.SequenceEqual(TestArray);
于 2013-04-25T20:11:49.593 回答
3

因为您没有比较每个数组的各个成员;您正在比较对每个数组的引用,它们不相等。

请改用SequenceEqual

于 2013-04-25T20:11:45.190 回答
1

在这种==情况下,运算符检查引用是否相等,而不是字节数组的内容是否相等。您应该迭代字节数组并检查它们是否逐字节相等或使用执行此操作的方法。

我想你把它从你的代码中取出来了,但是MemoryStream使用有点没有意义,你可以执行以下操作:

byte[] test = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };
于 2013-04-25T20:12:32.710 回答
1

您正在比较对对象的引用,即==运算符 - 在字节数组的情况下 - 当且仅当两个引用指向同一个对象时才返回 true。但实际上你有两个不同的对象,但它们具有相同的内容。

您必须使用该SequenceEqual方法来比较两个数组的内容

请注意,==对于某些类,运算符可以重载,以便它比较对象的内容(甚至具有一些其他逻辑)。但是,对于字节数组,==没有重载,因此默认情况下只是比较引用。

于 2013-04-25T20:14:58.290 回答
0

的代码MemoryStream.ToArray是:

public virtual byte[] ToArray() {
    byte[] dst=new byte[this._length-this._origin];
    Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0, this._length-this._origin);
    return dst;
}

而你得到错误的真正原因是,你声明了两个数组,但在其他事情上进行了比较。即使在 C 语言中,这种比较也不成立。

于 2013-04-25T20:46:23.570 回答
0

等于比较器不会执行所谓的“深度等于”检查。换句话说,equals 运算符只检查两个数组/对象是否存储在内存中的同一位置(换句话说,如果对象引用相同)。

要检查两个数组的值是否相等,您需要编写一个单独检查每个值的函数。

于 2013-04-25T20:13:06.457 回答
0

因为 byte[] 是一种引用类型,当您比较两个字节数组时,实际上将它们的引用与它们在内存中的位置进行比较,而不是它们的值

于 2013-04-25T20:14:03.663 回答
0

在您的示例中,当您使用相等运算符 ( ==) 时,您正在比较每个人所说的数组引用,而不是它的值。

一个简单的测试:

byte[] originalArray = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };

byte[] sameReferenceArray = originalArray;
originalArray == sameReferenceArray; //true

byte[] sameContentArray = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };
originalArray == sameContentArray; //false
于 2013-04-25T20:24:17.627 回答