11.C#编程指南-对象

类或结构定义的作用类似于蓝图,指定该类型可以进行哪些操作。从本质上说,对象是按照此蓝图分配和配置的内存块。程序可以创建同一个类的多个对象。对象也称为实例,可以存储在命名变量中,也可以存储在数组或集合中。使用这些变量来调用对象方法及访问对象公共属性的代码称为客户端代码。

对象标识与值相等性

在比较两个对象是否相等时,首先必须明确您是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。如果您要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例还是引用类型(类、委托、数组)的实例。

  • 若要确定两个类实例是否引用内存中的同一位置(意味着它们具有相同的标识),可使用静态Equals方法。(System.Object是所有值类型和引用类型的隐式基类,其中包括用户定义的结构和类。)
  • 若要确定两个结构实例中的实例字段是否具有相同的值,可以使用ValueType.Equals方法。由于所有结构都隐式继承自System.ValueType,因此可以直接在对象上调用该方法,如下面的示例所示:
    View Code
    Person p1 = new Person("Wallace", 75);
    Person p2;
    p2.Name = "Wallace";
    p2.Age = 75;
    
    if (p2.Equals(p1))
        Console.WriteLine("p2 and p1 have the same values.");
    
    // Output: p2 and p1 have the same values.

    Equals的System.ValueType实现使用反射,因为它必须能够确定任何结构中有哪些字段。在创建您自己的结构时,重写Equals方法可以提供针对您的类型的高效等算法。

  • 要确定两个类实例中字段的值是否相等,您可以使用Equals方法或==运算符。但是,只有类通过已重写或重载提供关于那种类型对象的相等含义的自定义时,才能使用它们。类也可能执行IEquatable<T>接口或IEqualityComparer<T>接口。这两个接口都提供可用于测试相等性的方法。设计好重写Equals的类后,请务必遵循如何:为类型定义值相等性(C# 编程指南)Object.Equals(Object) 中介绍的准则。 

posted on 2012-05-14 18:34  YeChun  阅读(178)  评论(0编辑  收藏  举报

导航