Object 类
命名空间:System
程序集:System.Runtime.dll, mscorlib.dll, netstandard.dll
支持 .NET 类层次结构中的所有类,并为派生类提供低级别服务。 这是所有 .NET 类的最终基类;它是类型层次结构的根。
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class Object
属性:ClassInterfaceAttribute,ComVisibleAttribute,SerializableAttribute
示例
下面的示例定义派生自 Object 类的点类型,并重写 Object 类的许多虚方法。
此外,该示例还演示了如何调用 Object 类的许多静态和实例方法。
using System;
// Point类是从System.Object派生的
class Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public override bool Equals(object obj)
{
//如果this和obj不引用同一类型,则它们不相等
if (obj.GetType() != this.GetType()) return false;
//如果x和y字段匹配,则返回true
var other = (Point) obj;
return (this.x == other.x) && (this.y == other.y);
}
//返回x和y字段的异或
public override int GetHashCode()
{
return x ^ y;
}
//以字符串形式返回点的值
public override String ToString()
{
return $"({x}, {y})";
}
//通过制作简单的字段副本返回此点对象的副本
public Point Copy()
{
return (Point) this.MemberwiseClone();
}
}
public sealed class App
{
static void Main()
{
//构造点对象
var p1 = new Point(1,2);
//制作另一个点对象,它是第一个点对象的副本
var p2 = p1.Copy();
//创建另一个引用第一个点对象的变量
var p3 = p1;
//下面的行显示false,因为p1和p2引用两个不同的对象
Console.WriteLine(Object.ReferenceEquals(p1, p2));
//下面的行显示为true,因为p1和p2引用具有相同值的两个不同对象
Console.WriteLine(Object.Equals(p1, p2));
//下面的行显示为true,因为p1和p3引用一个对象
Console.WriteLine(Object.ReferenceEquals(p1, p3));
//下面的行显示:p1的值是: (1, 2)
Console.WriteLine($"p1's value is: {p1.ToString()}");
}
}
//此代码示例生成以下输出:
//
// False
// True
// True
// p1's value is: (1, 2)
//
注解
语言通常不需要类声明从 Object 继承,因为继承是隐式的。
由于 .NET 中的所有类均派生自 Object,因此在 Object 类中定义的每个方法都可用于系统中的所有对象。
派生类可以和重写其中一些方法,其中包括:
· Equals-支持对象之间的比较。
· Finalize-在自动回收对象之前执行清理操作。
· GetHashCode-生成与对象的值相对应的数字以支持使用哈希表。
· ToString 制造描述类的实例的用户可读文本字符串。
性能注意事项
如果要设计的类(如集合)必须处理任何类型的对象,则可以创建接受 Object 类的实例的类成员。
但是,对类型进行装箱和取消装箱的过程会产生性能开销。 如果你知道新类将经常处理某些值类型,则可以使用以下两种策略之一来最大程度地减少装箱成本。
· 创建接受 Object 类型的常规方法,并创建一组特定于类型的方法重载,这些重载接受你希望类经常处理的每个值类型。 如果存在接受调用参数类型的特定于类型的方法,则不会发生任何装箱并调用类型特定的方法。 如果没有与调用参数类型匹配的方法参数,则将参数装箱,并调用常规方法。
· 将类型及其成员设计为使用泛型。 当你创建类的实例并指定泛型类型参数时,公共语言运行时将创建一个封闭式泛型类型。 泛型方法是类型特定的,可以在不装箱调用参数的情况下调用。
尽管有时需要开发接受和返回 Object 类型的通用类,但你可以通过提供特定于类型的类来处理常用类型,从而提高性能。 例如,提供特定于设置和获取布尔值的类可消除装箱和取消装箱布尔值的成本。
构造函数
Object():初始化 Object 类的新实例。
方法
Equals(Object):确定指定的对象是否等于当前对象。
Equals(Object, Object):确定指定的对象实例是否被视为相等。
Finalize():在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。
GetHashCode():用作默认哈希函数。
GetType():获取当前实例的 Type。
MemberwiseClone():创建当前 Object 的浅表副本。
ReferenceEquals(Object, Object):确定指定的 Object 实例是否是相同的实例。
ToString():返回一个表示当前对象的 string。
相关阅读 >>
更多相关阅读请进入《object》频道 >>

C#高级编程(第11版) C# 7 & .NET Core 2.0(.NET开发经典名著)
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。