Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个字节[]不等于具有相同值的另一个字节[]?_C#_Arrays_Compare_Bytearray - Fatal编程技术网

C# 为什么这个字节[]不等于具有相同值的另一个字节[]?

C# 为什么这个字节[]不等于具有相同值的另一个字节[]?,c#,arrays,compare,bytearray,C#,Arrays,Compare,Bytearray,我正在使用上面的简单代码。数组中的字节值相等。但是我的TestFunction()总是返回false。发生了什么事 因为您没有比较每个数组的单个成员;您正在比较对每个数组的引用,这些数组不相等 请改用。因为您没有比较每个数组的单个成员;您正在比较对每个数组的引用,这些数组不相等 改为使用。因为数组是.Net中的引用类型,对于数组,=操作符只检查它们是否是对内存中相同对象的引用。您需要使用它来比较每个字节: public static readonly byte[] TestArray=

我正在使用上面的简单代码。数组中的字节值相等。但是我的
TestFunction()
总是返回false。发生了什么事

因为您没有比较每个数组的单个成员;您正在比较对每个数组的引用,这些数组不相等


请改用。

因为您没有比较每个数组的单个成员;您正在比较对每个数组的引用,这些数组不相等


改为使用。

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

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);
}

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

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);
}

在这种情况下,
=
操作符检查引用是否相等,而不是字节数组的内容是否相等。您应该迭代字节数组并检查它们是否逐字节相等,或者使用一种方法来实现这一点

我想您可能在代码中的某个地方用到了这一点,但是
MemoryStream
的用法有点毫无意义,您可以执行以下操作:

test.SequenceEqual(TestArray);

在这种情况下,
=
操作符检查引用是否相等,而不是字节数组的内容是否相等。您应该迭代字节数组并检查它们是否逐字节相等,或者使用一种方法来实现这一点

我想您可能在代码中的某个地方用到了这一点,但是
MemoryStream
的用法有点毫无意义,您可以执行以下操作:

test.SequenceEqual(TestArray);

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


要检查两个数组的值是否相等,需要编写一个函数,分别检查每个值

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


要检查两个数组的值是否相等,需要编写一个函数,分别检查每个值

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

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

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

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

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

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

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


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

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

一个简单的测试:

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

在您的示例中,当您使用相等运算符(
==
)时,您是在按照大家所说的比较数组引用,而不是它的值

一个简单的测试:

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

MemoryStream.ToArray
的代码为:

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

得到false的真正原因是,声明了两个数组,但在另一个数组上进行了比较。这种比较即使在C语言中也不成立。

内存流的代码。ToArray是:

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

得到false的真正原因是,声明了两个数组,但在另一个数组上进行了比较。这种比较即使在C中也是不正确的。

添加了“在这种情况下”以进行区分。这是一个更大的应用程序的一部分,我正在处理
MemoryStream
s。我认为这可能与问题的原因有关,因此我将其包括在内。添加了“在本例中”以进行区分。这是我正在操作
MemoryStream
s的更大应用程序的一部分。我认为它可能与问题的原因有关,因此我将其包括在内。
=
运算符执行定义它要执行的任何类型。如果没有重载,引用类型的默认行为是比较引用,值类型的默认行为是对所有字段进行逐位比较,但这只是默认行为。
==
运算符执行类型定义的任何操作。如果没有重载,引用类型的默认行为是比较引用,值类型的默认行为是对所有字段进行逐位比较,但这只是默认行为。因为它们是引用类型,并且使用默认比较,即通过引用。存在重载的
=
和重写的
等于的引用类型