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的才是相等的,怎么做?
}
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的才是相等的,怎么做?
}
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;
}
}
}
在.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是指下同一个对象的,
我一直觉得引用很矛盾!也许我对这个理解得不透彻!
我永远觉得C++里面的引用和指针是同一个东西!
比如:
class CO{...};
CO *Co1,
CO Co2;
CO1=&Co2;
CO &Co3;
Co3=CO1;
Co3和Co1有区别吗?
void fun1(CO *pCO)
{;//....
}
CO CO4;
fun1(&CO4);
唯一的解吸就是&有二个作用,一个是取地址,一个是定义一个引用类型.但我觉得别扭,没有符号可以用了吗?为什么就用这个!
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
public class Cobj
{
public int x;
}你这个没有重写Equals和重载==,那么Obj1==Obj2是不成立的如果单纯比较两个对象是否是同一对象,用object.ReferenceEquals
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的才是相等的,怎么做?
}
楼主这不相等吧。