 本页内容FAQ 条目(按类别排列)最新条目为什么引用类型不是多态类型? 问:为什么引用类型不是多态类型? 答:请考虑以下代码: using System;class Dog { public string Name;}class Test{ public static void Swap(ref object a, ref object b) { object temp; temp = a; a = b; b = temp; } public static void Main() { Dog d1 = new Dog(); d1.Name = "fido"; Dog d2 = new Dog(); d2.Name = "rex"; Swap(ref d1, ref d2); }} 编译器将对 Swap() 函数调用时报告错误。为什么?请考虑 Swap 函数采用以下形式的情况: public static void Swap(ref object a, ref object b) { a = 5; b = “Hello“; } 如果编译器允许使用上述代码,这将意味着将装箱的 int 类型值赋给 Dog 对象,这显然不是类型安全的。 [作者:Eric Gunnerson] 发布时间:2004 年 4 月 8 日 14:55:00 GMT 星期四 评论(11) 什么时候应该使用 ==?什么时候应该使用 Equals?Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。 对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。 对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。 到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例: using System;public class Test{static void Main(){ // Create two equal but distinct strings string a = new string(new char[] { |