讲解C#面相对象编程中的类与对象的特性与概念

2019-12-26 16:54:33于丽

p1 和 p2 的内存在线程堆栈上进行分配。该内存随声明它的类型或方法一起回收。这就是在赋值时复制结构的一个原因。相比之下,当对类实例对象的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。无法像在 C++ 中那样明确地销毁类对象。

对象标识与. 值相等性
在比较两个对象是否相等时,首先必须明确您是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。如果您要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例,还是引用类型(类、委托、数组)的实例。
若要确定两个类实例是否引用内存中的同一位置(意味着它们具有相同的标识),可使用静态 Equals 方法。(System.Object 是所有值类型和引用类型的隐式基类,其中包括用户定义的结构和类。)
若要确定两个结构实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。由于所有结构都隐式继承自 System.ValueType,因此可以直接在对象上调用该方法,如下面的示例所示:


// Person is defined in the previous example.

//public struct Person
//{
//  public string Name;
//  public int Age;
//  public Person(string name, int age)
//  {
//    Name = name;
//    Age = age;
//  }
//}

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.");

输出:


 p2 and p1 have the same values.

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



注:相关教程知识阅读请移步到c#教程频道。