none
怎样比较两个T类型对象的地址? RRS feed

  • 问题

  • //判断两个类型相同的对象的内存地址是否一致。
    bool IsTheSameObj<T>( T obj1, T obj2)
    {
       //语法编译不过,怎么办?怎样才能强制比较它们的内存地址呢?
       return (obj1 == obj2); 
    }
    
    
    2011年2月13日 15:14

答案

  • 你的问题描述不够详细。
    如果是值类型,那obj1和obj2就是原来参数的副本,只是2个形参,那地址定然不同的,你可以反编译看看生成的IL是有分配和复制的。
    如果是引用类型,直接用==就可以了。我猜测你的意思这样,如果是引用类型,对比引用指向的对象,如果值类型,则进行值类型比较,我的测试如下,你看是否满足你的要求。

    public void Test()
    {
      int a, b;
      a = 6;
      b = 6;
      Console.WriteLine(IsTheSameObj<int>(a, a));
    }
    
    bool IsTheSameObj<T>(T obj1, T obj2)
    {
      return typeof(T).IsClass ? object.ReferenceEquals(obj1, obj2) : obj1.Equals(obj2);
    }
    

    2011 c# mvp China
    • 已建议为答案 Neddy Ren 2011年2月17日 6:09
    • 已标记为答案 Charles Shao 2011年2月17日 6:57
    2011年2月15日 1:02
    版主

全部回复

  • return Object.ReferenceEquals(obj1, obj2);
    • 已建议为答案 Neddy Ren 2011年2月17日 6:08
    2011年2月13日 17:23
  • 您好,

    因为T类型不明确,有些struct类型是不实现==操作符的。

    既然目的是判断地址那么应针对引用类型。请参考:

            bool IsTheSameObj<T>(T obj1, T obj2) where T : class
            {
                //语法编译不过,怎么办?怎样才能强制比较它们的内存地址呢?
                return (obj1 == obj2);
            }

    2011年2月14日 12:17
    版主
  • 你的问题描述不够详细。
    如果是值类型,那obj1和obj2就是原来参数的副本,只是2个形参,那地址定然不同的,你可以反编译看看生成的IL是有分配和复制的。
    如果是引用类型,直接用==就可以了。我猜测你的意思这样,如果是引用类型,对比引用指向的对象,如果值类型,则进行值类型比较,我的测试如下,你看是否满足你的要求。

    public void Test()
    {
      int a, b;
      a = 6;
      b = 6;
      Console.WriteLine(IsTheSameObj<int>(a, a));
    }
    
    bool IsTheSameObj<T>(T obj1, T obj2)
    {
      return typeof(T).IsClass ? object.ReferenceEquals(obj1, obj2) : obj1.Equals(obj2);
    }
    

    2011 c# mvp China
    • 已建议为答案 Neddy Ren 2011年2月17日 6:09
    • 已标记为答案 Charles Shao 2011年2月17日 6:57
    2011年2月15日 1:02
    版主