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

为什么System.Attribute的GetHashCode方法需要如此设计?

发布时间:2020-12-16 09:07:40 所属栏目:asp.Net 来源:网络整理
导读:昨天我在实现《通过扩展改善ASP.NET MVC的验证机制[使用篇]》的时候为了Attribute 的一个小问题后耗费了大半天的精力,虽然最终找到了问题的症结并解决了问题,但是我依然不知道微软如此设计的目的何在。闲话少说,我们先来演示一下我具体遇到的问题如何发生

昨天我在实现《通过扩展改善ASP.NET MVC的验证机制[使用篇]》的时候为了Attribute 的一个小问题后耗费了大半天的精力,虽然最终找到了问题的症结并解决了问题,但是我依然不知道微软如此设计的目的何在。闲话少说,我们先来演示一下我具体遇到的问题如何发生的。

目录:
一、问题重现
二、通过Attribute的Equals方法和GetHashCode方法进行对等判断
三、Attribute对象和Attribute类型的HashCode
四、倘若为FooAttribute添加一个属性/字段
五、Attribute的GetHashCode方式是如何实现的?

一、问题重现

如下面的代码片断所示,我们定义了两个Attribute。其中抽象的BaseAttribute中定义了一个Name属性,而FooAttribute直接继承自BaseAttribute,并不曾定义任何属性和字段。在类型Bar上,我们应用了三个FooAttribute特性,其Name属性分别为A、B和C。

   1: [Foo(Name = "A")]
   3: [Foo(Name = "C")]
   5: { 
   7: }
   9: [AttributeUsage( AttributeTargets.Class,Inherited=true,AllowMultiple=true)]
  11: {
  13: }
  15: { 

   1: var attributes = typeof(Bar).GetCustomAttributes(true).OfType<FooAttribute>().ToList<FooAttribute>();
   3: attributes.Remove(attribute);
   1: B
   1: FooAttribute attribute1 = new FooAttribute{ Name = "ABC" };
   3: Console.WriteLine("attribute1.Equals(attribute2) = {0}",attribute1.Equals(attribute2));
   1: attribute1.Equals(attribute2) = True
   6:     attribute1.GetHashCode() == typeof(FooAttribute).GetHashCode());

typeof(FooAttribute)和FooAttribute对象之间对等性可以通过如下的输出结果看出来:

3: attribute1.GetHashCode() == typeof(FooAttribute).GetHashCode() = True

四、倘若为FooAttribute添加一个属性

但是不要以为Attribute的GetHashCode方法总是返回类型本身的HashCode,如果我们在FooAttribute定义一个属性/字段,最终的对等性判断又会不同。为此我们在FooAttribute定义了一个Type属性。

2: {
   4: }   

然后我们在创建FooAttribute时指定其Type属性:

int)};
   1: attribute1.Equals(attribute2) = False
typeof(FooAttribute).GetHashCode() = False

五、Attribute的GetHashCode方式是如何实现的?

Attribute的HashCode是由定义在自身类型的字段值派生,不包括从基类继承下来的属性值。如果自身类型不曾定义任何字段,则直接使用类型的HashCode,这可以通过Attribute的GetHashCode方法的实现看出来,而Equals的逻辑与此类似。

2: override int GetHashCode()
   4:     Type type = base.GetType();
   6:     object obj2 = null;
   8:     {
  10:         if ((obj3 != null) && !obj3.GetType().IsArray)
  12:             obj2 = obj3;
  14:         if (obj2 != null)
  16:             break;
  18:     }
  20:     {
  22:     }
  24: }

(编辑:李大同)

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

    推荐文章
      热点阅读