c#中的object类

来源:互联网 发布:秒杀器 淘宝 编辑:程序博客网 时间:2024/05/15 21:16
Object 类:支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级别服务。这是 .NET Framework 中所有类的最终基类;它是类型层次结构的根。
★ Object 类是类体系结构的根
★ Csharp 中的每个类都是 Object 类直接或间接的子类
★ Object 类定义了所有对象都具备的基本状态和行为
★ 可以用类型为 Object 的变量来引用任意类型的对象

语言通常不要求类声明从 Object 的继承,因为继承是隐式的。
因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。派生类可以而且确实重写这些方法中的某些,其中包括:
★ Equals — 支持对象间的比较。
★ Finalize — 在自动回收对象之前执行清理操作。
★ GetHashCode — 生成一个与对象的值相对应的数字以支持哈希表的使用。
★ ToString — 生成描述类的实例的可读文本字符串。

【Object.ToString 方法】
  • 返回表示当前 Object 的 String。
  • Object.ToString()声明为一个虚方法,在自定义类中如果希望ToString()返回一个字符串包含类中对象的值信息,可以重写ToString()方法。注意:这个方法必须声明为override。
class Point{
public int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
public override string ToString(){
return "(" + x +"," + y + ")";
}
}

【Object.Equals 方法】确定指定的 Object 是否等于当前的 Object。
Equals 的默认实现支持引用相等性(对于引用类型)和按位相等性(对于值类型)。引用相等性是指进行比较的多个对象引用所引用的是同一个对象。按位相等性是指进行比较的多个对象具有相同的二进制表示形式。
此方法可由派生类重写。例如,如果两个对象表示相同的值,则许多基数据类型返回 true;否则返回 false。
此方法仅比较基元和对象。若要比较更复杂的结构(如对象数组),必须重写该方法。

下面是针对实现值类型的准则:
考虑重写 Equals,以便在 ValueType 上获得比 Equals 的默认实现所提供的性能增强的性能。
如果重写 Equals 并且语言支持运算符重载,则必须重载值类型的相等运算符。

下面是针对实现引用类型的准则:
如果引用类型的语义是基于该类型表示某个(些)值的事实,则考虑对该类型重写 Equals。
即使大多数引用类型重写 Equals,它们也必须不能重载相等运算符。但是,如果实现的引用类型想要具有值语义(如复杂的数字类型),则必须重写相等运算符。
using System;

public class Sample {
void Method() {
Object Obj1 = new Object();
Object Obj2 = new Object();
Console.WriteLine(Obj1.Equals(Obj2)); //===> false
Obj2 = Obj1;
Console.WriteLine(Obj1.Equals(Obj2)); //===> true
}
}

【Object.GetHashCode 方法】用作特定类型的哈希函数。
GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。
GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。

哈希函数必须具有以下特点:
  • 如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
  • 一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
  • 为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
using System;

public struct Int32 {
public int value;

public override int GetHashCode_r() {
return value;
}
}

【Object.Finalize 方法】
允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。

Finalize 操作具有下列限制:
  • 垃圾回收过程中执行终结器的准确时间是不确定的。不保证资源在任何特定的时间都能释放,除非调用 Close 方法或 Dispose 方法。
  • 即使一个对象引用另一个对象,也不能保证两个对象的终结器以任何特定的顺序运行。即,如果对象 A 具有对对象 B 的引用,并且两者都有终结器,则当对象 A 的终结器启动时,对象 B 可能已经终结了。
  • 运行终结器的线程是未指定的。
默认情况下,Object.Finalize 不执行任何操作。只有在必要时才必须由派生类重写它,因为如果必须运行 Finalize 操作,垃圾回收过程中的回收往往需要长得多的时间。
如果 Object 保存了对任何资源的引用,则 Finalize 必须由派生类重写,以便在垃圾回收过程中,在放弃 Object 之前释放这些资源。

【性能注意事项】
如果要设计的类(如集合)必须处理所有类型的对象,则可以创建接受 Object 类的实例的类成员。但是,对类型进行装箱和取消装箱的过程会增加性能开销。如果知道新类将频繁处理某些值类型,则可以使用下列两种策略之一,以使装箱开销减至最少。
一种策略是创建一个一般方法和一组类型特定的重载方法;一般方法接受 Object 类型,重载方法接受类预期要频繁处理的所有值类型。如果某个类型特定的方法可接受调用参数类型,调用该类型特定的方法时则无需进行装箱。如果调用参数类型与方法参数都不匹配,则对该参数进行装箱并调用一般方法。
另一种策略是将类及其方法设计为使用泛型。在创建类的实例并指定一个泛型类型参数时,公共语言运行库创建一个封闭泛型类型。泛型方法是类型特定的,无需对调用参数进行装箱即可调用。

【示例】定义一个派生自 Object 类的 Point 类型,然后重写 Object 类的很多虚方法。此外,该示例还演示如何调用 Object 类的很多静态方法和实例方法。
using System;

class Point {
public int x, y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public override bool Equals(object obj) {
if (obj. GetType_r() != this. GetType_r()) return false;

Point other = (Point) obj;
return (this.x == other.x) && (this.y == other.y);
}

public override int GetHashCode_r() {
return x ^ y;
}

public override String ToString() {
return String.Format("({0}, {1})", x, y);
}

public Point Copy() {
return (Point) this.MemberwiseClone();
}
}

public sealed class App {
static void Main() {
Point p1 = new Point(1,2);
Point p2 = p1.Copy();
Point p3 = p1;

Console.WriteLine(Object.ReferenceEquals(p1, p2));
Console.WriteLine(Object.Equals(p1, p2));
Console.WriteLine(Object.ReferenceEquals(p1, p3));
Console.WriteLine("p1's value is: {0}", p1.ToString());
}
}
原文地址:http://www.dingos.cn/index.php?topic=1079.0

【运行结果】
False
True
True
p1's value is: (1, 2)
原创粉丝点击