加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ValueTypes的数组不喜欢object.Equals?

发布时间:2020-12-16 00:03:15 所属栏目:百科 来源:网络整理
导读:这让我把头发拉了几天: byte[] _A = new byte[64];// Fill _A with some meaningful,valid data.byte[] _B = new byte[_A.Length];_A.CopyTo( _B,0 );if( !_A.Equals( _B ) ) { throw new WtfException( "It appears object.Equals doesn't work on arrays
这让我把头发拉了几天:

byte[] _A = new byte[64];
// Fill _A with some meaningful,valid data.

byte[] _B = new byte[_A.Length];
_A.CopyTo( _B,0 );

if( !_A.Equals( _B ) ) {
    throw new WtfException(
        "It appears object.Equals doesn't work on arrays of value types...");
}

是的,抛出WtfException.我花了几天时间才注意到. byte是ValueType.但是,byte []是一个System.Array,它是一个引用类型.根据.NET文档:

The default implementation of Equals supports reference equality for
reference types,and bitwise equality for value types. Reference
equality means the object references that are compared refer to the
same object. Bitwise equality means the objects that are compared have
the same binary representation.

有人可以帮忙吗?

解决方法

_A和_B不是对同一数组的引用.因此,他们并不平等.你需要做这样的事情:

private static bool ValueTypeArraysAreEqual( Array p_lhs,Array p_rhs ) {
if( p_lhs == null ) {
return p_rhs == null;
}
if( p_rhs == null ) {
return false;
}
if( p_lhs.Length != p_rhs.Length ) {
return false;
}
return Parallel.For( 0,p_lhs.Length,( _lcv,loopState ) => {
if( !p_lhs.GetValue( _lcv ).Equals( p_rhs.GetValue( _lcv ) ) ) {
loopState.Break();
}
} ).IsCompleted;
}

你可以在循环中使用object.Equal,因为你可以比较Loop包含的ValueTypes. System.Threading.Tasks.Parallel的使用帮助我更快地移动事物. Parallel.For返回一个结构,告诉您循环是否已停止.如果你从未用loopState.Break停止循环,那么它们都匹配.如果由于某种原因,你不能使用Parallel.For,只需执行一个返回false的for循环;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读