ReferenceEquals, == , Equals1. ReferenceEquals, == , Equals a) ReferenceEquals b) ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。 Int a = 100; If(a == b) 上面这段程序将会输出: 而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如: If(a == b) 上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。 对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于 系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。 c) Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。 int a = 5; If(Object.Equals(a ,b)) 事实上,这两个版本的结果完全相同,如果用户重载了Equals,调用的都是用户重载后的Equals。Equals的静态方法的好处是可以不必考虑用于比较的对象是否为null。 Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。 StringBuilder a = new StringBuilder(); if (s2 == s1) if (Object.Equals(s2, s1)) if (Object.ReferenceEquals(s2, s1)) 这个实例将输出: 注:对于String类,直接声明s1 = “the test a”的话,输出结果将包含 "ReferenceEquals returns true", 在C#中,有多种比较方法,有referenceequal,equals,equalsto,但他们之间是有细微差别的。 referenceequal的实例 class MyClass { static void Main() { Console.WriteLine(Object.ReferenceEquals(o, p)); memberwiseclone()翻译为成员智能复制,呵呵,为啥智能,我就讲讲。智能就在它区别对待值类型和引用类型。 MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。 例如,考虑一个名为 X 的对象,该对象引用对象 A 和 B。对象 B 又引用对象 C。X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。与此相对照,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2,它们分别是 A 和 B 的副本。B2 又引用新对象 C2,C2 是 C 的副本。 关于深拷贝和浅拷贝,深拷贝就是创建一个一摸一样的对象,浅拷贝的话仍然是同一个对象,但是却有2个计数器,2个强引用指向它。 |
|