代码之家  ›  专栏  ›  技术社区  ›  Shaun Luttin

为什么具有相同哈希代码的这些操作具有不同的调用列表?

  •  0
  • Shaun Luttin  · 技术社区  · 7 年前

    代码示例讲述了这个问题的故事。 Here it is as a Fiddle .

    我希望这些操作的行为类似于“普通”引用类型实例 such as List<Action> .

    using System;
    
    public class Program
    {
        static Action action1;
        static Action action2;
        public static void Main()
        {
            // the Both method goes to both action1 and action2
            // that is what I expected
            action1 = Both;
            action2 = action1;
    
            // anything now assigned to action1 only goes to action1
            action1 += OnlyAction1;
    
            // and anything now assigned to action2 only goes to action2
            action2 += OnlyAction2;
    
            foreach (var d in action1.GetInvocationList())
                Console.WriteLine(d.Method.Name);
    
            foreach (var d in action2.GetInvocationList())
                Console.WriteLine(d.Method.Name);
    
            // since both actions have the same HashCode, 
            // I expected both actions to have the same invocation list, 
            Console.WriteLine(action1.GetHashCode());
            Console.WriteLine(action2.GetHashCode());
        }
    
        public static void Both() {}
        public static void OnlyAction1() {}
        public static void OnlyAction2() { }
    }
    

    输出:

    Both
    OnlyAction1
    Both
    OnlyAction2
    828401262
    828401262
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Backs    7 年前

    相等的散列代码并不表示对象是相等的。

    如果两个对象比较为相等,则每个对象的getHashcode方法 对象必须返回相同的值。但是,如果两个对象没有 将这两个对象的getHashcode方法作为相等的方法进行比较 必须返回不同的值 .

    不同的散列码意味着对象不同,但反之亦然。

    阅读更多gethashcode方法: https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx

    another 答:

    委托是不可变的,因此在该代码中获得的引用是 保证不会改变。如果用户在之后订阅或取消订阅 空检查将创建一个新委托并将其设置为事件。