c++:
class Cobj
{
public:
int x;
}
Cobj *Obj1,*Obj2;
Obj1=new Cobj();Obj1->x=1;
Obj2=new Cobj();Obj2->x=1;
if(Obj1==Obj2)
{;//结果是不相等(应该是比较地址!)
}
c#
public class Cobj
{
public int x;
};Cobj Obj1,Obj2;
Obj1=new Cobj();
Obj2=new Cobj();
Obj1.x=1;Obj2.x=1;
if(Obj1==Obj2)
{;//结果是相等的!即使Cobj是不含类的结构,定义一个不安全的指针,比较也是相等的,C#比较不是用内存,而是用值.但我需要象C++那样比较不同的对象,只要是真正一个地方new的才是相等的,怎么做?
}

解决方案 »

  1.   

    Object.Equeal()就是比较两个引用类型变量是不是指向同一个对象
      

  2.   

    我不想为对象增加tag这样的标识,C#不可以做用内存地址去比较的吗?因为对象在不同地方生成,放到ArrayList里面,在不同的地方传到方法里面,需要做对象的比较!但是第一个比较就相等了,郁闷!
      

  3.   

    System.Text.StringBuilder s1,s2;
    s1=new System.Text.StringBuilder("1");
    s2=new System.Text.StringBuilder("1");
    if(s1.Equals(s2))
    {
    MessageBox.Show("相等");
    }
    你试一下!我要的是s1!=s2;
    如果这样:
    System.Text.StringBuilder s1,s2;
    ArrayList List=new ArrayList();
    s1=new System.Text.StringBuilder("1");
    s2=new System.Text.StringBuilder("1");
    List.Add(s1);
    List.Add(s2);
    bool Var=Comp(s2);//这时候肯定是i=0的时候就返回了!我要的是第二个才相等!
    ///////////
    bool Comp(System.Text.StringBuilder ps)
    {
        for(int i=0;i<List.Count;i++)
        {
            if(((System.Text.StringBuilder)List[i]).Equals(ps))
            {return true;break;
            }
        }
    }
      

  4.   

    建议你去看一下比较深入的介绍.net framework的书
    在.net中有两种类型的对象,值类型和引用类型,在没有重写equeal方法的情况下,值类型的equeal比较的是变量所指对象的内容,引用类型比较的是两个变量是否同时指向一个对象.
    所以int a=3;int b=3;时a.Equeal(b)为true;
    而object o1=new object();object o2=new object();时o1.Equeal(o2)为false;
    虽然字符串是引用类型,但.net中对字符串特殊处理. .net中把所有的字符串都存放在一张hashtable中,而字符串的值作为key;这样的话string s1="123";string s2="123";时s1与s2是指下同一个对象的,
      

  5.   

    那一个简单的 class对象怎么知道它是引用类型还是值类型?
    我一直觉得引用很矛盾!也许我对这个理解得不透彻!
    我永远觉得C++里面的引用和指针是同一个东西!
    比如:
    class CO{...};
    CO *Co1,
    CO Co2;
    CO1=&Co2;
    CO &Co3;
    Co3=CO1;
    Co3和Co1有区别吗?
    void fun1(CO *pCO)
    {;//....
    }
    CO CO4;
    fun1(&CO4);
    唯一的解吸就是&有二个作用,一个是取地址,一个是定义一个引用类型.但我觉得别扭,没有符号可以用了吗?为什么就用这个!
      

  6.   

    // 那一个简单的 class对象怎么知道它是引用类型还是值类型
    Type t1 = typeof(System.Int32); // Int32为值类型
    Type t2 = typeof(System.String); // String为引用类型
    Console.WriteLine(t1.BaseType); // System.ValueType
    Console.WriteLine(t2.BaseType); // System.Object值类型总是直接继承System.ValueType,别的都是引用类型// 我永远觉得C++里面的引用和指针是同一个东西
    区别在于GC/托管堆
    .NET的引用类型的对象在托管堆上创建,和CRT堆不同,托管堆上对象的地址会不断地变化,所以你以为你得到了内存地址,但是只能算个“句柄”
    托管堆上的引用比较和C++的内存地址比较在使用上完全一致
    因为GC会对比两个对象的“句柄”是否一致,相当于C++的内存地址比较(实际上却不是)Object.Equals方法提供了引用判等的途径
    但是继承了Object的对象有可能重写这个方法,变成值判等,比如System.String
    而值类型(继承了System.ValueType的类型),使用Equals方法时总是进行值判等struct Account
    {
    public string Name;
    public string Password;
    }
    class Person
    {
    public string Name;
    public string Password;
    }
    ...
    Account a1 = new Account();
    Account a2 = new Account();
    Console.WriteLine(a1.Equals(a2)); // truePerson p1 = new Person();
    Person p2 = new Person();
    Console.WriteLine(p1.Equals(p2)); // false
      

  7.   

    自定义的比较的话,在你的新的类型(管他是什么类型)里面,重写Equals和GetHashCode方法,写入比较“值”的代码就是了啊C#的默认比较是值类型就比较值,引用类型就比较引用。
      

  8.   

    好复杂哦,总是觉得C#不够C++的指针对象那么好用,特别在对象需要放到LIST里面等待另外一些线程去处理的时候.
      

  9.   

    你的题目本来就不对..
    public class Cobj
    {
    public int x;
    }你这个没有重写Equals和重载==,那么Obj1==Obj2是不成立的如果单纯比较两个对象是否是同一对象,用object.ReferenceEquals
      

  10.   

    c#
    public class Cobj
    {
    public int x;
    };Cobj Obj1,Obj2;
    Obj1=new Cobj();
    Obj2=new Cobj();
    Obj1.x=1;Obj2.x=1;
    if(Obj1==Obj2)
    {;//结果是相等的!即使Cobj是不含类的结构,定义一个不安全的指针,比较也是相等的,C#比较不是用内存,而是用值.但我需要象C++那样比较不同的对象,只要是真正一个地方new的才是相等的,怎么做?
    }
    楼主这不相等吧。
      

  11.   

    ^_^,lost大哥先一步指出题目错误·~~原因速马已经说的比较清楚了,看看就清楚了。