文章目录
九 所有类的父类 System.Object
9.1 定义
-
命名空间:
System
-
程序集:
mscorlib.dll
9.2 人话解释
System.Object 设计的目的是为了创建一个.Net语言的类型的对象的基类,这里说的语言包括了C#、VB等面向.Net的语言。
上帝视角看,System.Object 这个基类定义了 类型
的基础能力和行为:
- 对象之间实例的比较方法;
- 获取Hash码;
- 获取类型信息;
- 描述当前对象的字符串;
- 浅复制方法;
- GC回收操作之前的析构方法;
所以 Object不仅是C#语言的类型根、还是VB等所有面向.NET的语言的类型根,它是整个FCL(Framework Class Library)的类型根。
System.Object 是所有类的基类,你问我什么是对象,System.Object 它就是所有对象的… 最起码是个爸爸,为啥呢?
因为它支持 .NET 类层次结构中的所有类,并为派生类提供低级别服务。
有人说,我创建的类并没有继承 System.Object 呀?
通常不需要类显式的来声明继承 System.Object ,因为继承的实现是隐式的。
这是所有 .NET 类的最终基类,它是类型层次结构的根,大家虽不能把根留住,一定要把根怎么用的记住。
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class Object
9.3 有什么用?
因为 .NET 中的所有类都是从派生的 Object ,所以类中定义的每个方法 Object 都可用于系统中的所有对象。
派生类可以和重写其中一些方法,其中主要包括:
- Equals -支持对象之间的比较,可以重写自定义的比较规则。
- Finalize -在自动回收对象之前执行清理操作,可以重写自定义的内存释放或回收之前执行特定操作。
- GetHashCode -生成与对象的值相对应的数字以支持使用哈希表。
- ToString -按自定义规则创建描述类的实例信息的,供用户读取的文本字符串。
public class Object
{
//构造函数
public Object();
//虚成员
//确定指定对象是否等于当前对象。
public virtual bool Equals(object obj);
//在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。
protected virtual void Finalize();
//作为默认哈希函数。
public virtual int GetHashCode();
//返回表示当前对象的字符串。
public virtual string ToString();
//实例成员
//获取当前实例的 Type。
public Type GetType();
//创建当前 Object 的浅表副本。
protected object MemberwiseClone();
//静态成员
//确定指定的对象实例是否被视为相等。
public static bool Equals(object objA,object objB);
//确定指定的 Object 实例是否是相同的实例。
public static bool ReferenceEquals(object objA,object objB);
}
9.4 性能注意事项
如果正在设计的类(如集合)必须处理任何类型的对象,则可以创建接受类的实例的类成员 Object 。
但是,对类型进行装箱和取消装箱的过程会产生性能开销。
如果你知道新类将经常处理某些值类型,则可以使用以下两种策略之一来最大程度地减少装箱成本。
- 创建接受类型的常规方法 Object ,并创建一组特定于类型的方法重载,这些重载接受你希望类经常处理的每个值类型。 如果存在接受调用参数类型的特定于类型的方法,则不会发生任何装箱并调用类型特定的方法。 如果没有与调用参数类型匹配的方法参数,则将参数装箱,并调用常规方法。
- 将类型及其成员设计为使用泛型。 当你创建类的实例并指定泛型类型参数时,公共语言运行时将创建一个封闭式泛型类型。 泛型方法是类型特定的,可以在不装箱调用参数的情况下调用。
尽管有时需要开发接受和返回类型的通用类 Object ,但你可以通过提供类型特定的类来处理常用类型,从而提高性能。 例如,提供特定于设置和获取布尔值的类可消除装箱和取消装箱布尔值的成本。
9.5 使用示例
下面的示例定义了从类派生的点类型 Object ,并重写了类的许多虚方法 Object 。
此外,该示例还演示了如何调用类的多个静态和实例方法 Object 。
using System;
// The Point class is derived from 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)
{
// If this and obj do not refer to the same type, then they are not equal.
if (obj.GetType() != this.GetType()) return false;
// Return true if x and y fields match.
var other = (Point) obj;
return (this.x == other.x) && (this.y == other.y);
}
// Return the XOR of the x and y fields.
public override int GetHashCode()
{
return x ^ y;
}
// Return the point's value as a string.
public override String ToString()
{
return $"({x}, {y})";
}
// Return a copy of this point object by making a simple field copy.
public Point Copy()
{
return (Point) this.MemberwiseClone();
}
}
public sealed class App
{
static void Main()
{
// Construct a Point object.
var p1 = new Point(1,2);
// Make another Point object that is a copy of the first.
var p2 = p1.Copy();
// Make another variable that references the first Point object.
var p3 = p1;
// The line below displays false because p1 and p2 refer to two different objects.
Console.WriteLine(Object.ReferenceEquals(p1, p2));
// The line below displays true because p1 and p2 refer to two different objects that have the same value.
Console.WriteLine(Object.Equals(p1, p2));
// The line below displays true because p1 and p3 refer to one object.
Console.WriteLine(Object.ReferenceEquals(p1, p3));
// The line below displays: p1's value is: (1, 2)
Console.WriteLine($"p1's value is: {p1.ToString()}");
}
}
// This code example produces the following output:
//
// False
// True
// True
// p1's value is: (1, 2)
//
9.6 适用范围
产品 | 版本 |
---|---|
.NET | Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6 |
.NET Framework | 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8 |
.NET Standard | 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1 |
UWP | 10.0 |
Xamarin.iOS | 10.8 |
Xamarin.Mac | 3.0 |
9.7 线程安全性
Shared
此类型) 成员 Visual Basic 的公共静态 (是线程安全的。
实例成员不一定是线程安全的。
9.8 使用注意事项
参考链接