System.Object类是.NET所有类型的根,任何类型都可以直接或间接地继承System.Object。所有继承System.Object的对象都会具有其特性。没有指定基类的类型也默认继承为System.Object。
其别名也就是object。
静态函数
Equals
public static bool Equals(Object objA, Object objB);
确定objA对象实例是否与objB被视为相等?在这里我们可以重写对象的Equals函数以满足我们的业务需求。
- 如果objA和objB为null,会返回true
print(System.Object.Equals(null,null));//返回true
- Equals 会自动进行null检查,检查失败会返回false
- 在struct结构中由于值类型无法派生它,默认Equals会自己检查null和运行时类型。所以在重写中我们可以不进行类型检测。前实例是值类型,则 Equals(Object) 该方法会测试值相等性。两个对象的公共字段和专用字段的值相等时,会返回true。
- 对于值类型,应始终重写 Equals,因为对依赖反射的相等性测试的性能不佳。 还可以重写引用类型的默认实现 Equals ,以测试值相等性而不是引用相等性,并定义值相等的精确含义。
ReferenceEquals
public static bool ReferenceEquals(Object objA, Object objB);
如果 objA 是与 objB 相同的实例,或如果两者均为 null,则为 true,否则为 false。
ReferenceEquals 于 Equals 不同它无法被重写。如果要测试两个对象引用是否相等,并且不确定该方法的 Equals 实现,则可以调用此方法。这里要记住是引用时候相等。
- 比较值类型时。 如果 objA 并且 objB 是值类型,则会在将它们传递到 ReferenceEquals 方法之前进行装箱。 这意味着,如果同时objAobjB表示值类型的同一实例,仍然是false。如下:
print(System.Object.ReferenceEquals(1, 1));//返回false
- 比较字符串时。当比较如下两个字符串时:
String s1 = "String1";
String s2 = "String1";
由于字符串暂存池的原因。ReferenceEquals 会返回true。我们可以通过String.IsInterned获取字符串是否在暂存池中。当我们对s1和s2进行一个合并,就会破坏暂存池的条件。
s1 += "a";
s2 += "a";
哪怕s1和s2具有相同值,ReferenceEquals也会返回false。
公共函数
Equals
public virtual bool Equals(Object obj);
确定对象实例是否与obj被视为相等?在这里我们可以重写对象的Equals函数以满足我们的业务需求。
重写Equals
class People
{
public string Name;
public People(string name){Name = name;}
public override bool Equals(object obj){return obj is People && ((People)obj).Name == Name;}
public override int GetHashCode(){return base.GetHashCode();}
}
void Start()
{
Debug.LogFormat("相同名字-是否相同:{0}",new People("李明").Equals(new People("李明")));
Debug.LogFormat("不同名字-是否相同:{0}", new People("李明").Equals(new People("李海")));
}
- 如果重写 Equals 的方法在测试两个对象时返回 true 相等性,
则重写 GetHashCode 的方法必须为这两个对象返回相同的值。
但是,如果两个对象不相等,则 GetHashCode() 两个对象的方法不必返回不同的值。
GetHashCode
public virtual int GetHashCode();
当前对象的哈希代码,该数值的范围与 Int32 类型相同或更小。
哈希代码是一个数值,用于在基于哈希的集合(如 Dictionary<TKey,TValue> 类、 Hashtable 类或派生自 DictionaryBase 类的类型)中插入和标识对象。 此方法 GetHashCode 为需要快速检查对象相等性的算法提供此哈希代码。
两个相等的对象返回的哈希代码相等
两个返回相同哈希代码的对象不一定相等,因为不同的对象可以具有相同的哈希代码。
- .NET 不保证该方法的默认实现GetHashCode,此方法返回的值在 .NET 实现之间可能有所不同,例如不同版本的 .NET Framework 和 .NET Core,以及 32 位和 64 位平台等平台。 出于这些原因,
请勿将此方法的默认实现用作哈希处理的唯一对象标识符
。 - 哈希代码用于在基于哈希表的集合中高效插入和查找, 哈希代码不是永久值,出于此原因:
不要序列化哈希代码值或将它们存储在数据库中。
请勿使用哈希代码作为键从键控集合中检索对象。
- 不要跨应用程序域或进程发送哈希代码。 在某些情况下,哈希代码可以按进程或按应用程序域计算。
- 如果需要加密强哈希,请不要使用哈希代码而不是加密哈希函数返回的值。
如果重写 GetHashCode 该方法,还应重写 Equals,反之亦然。如果重写 Equals 的方法在测试两个对象时返回 true 相等性,则重写 GetHashCode 的方法必须为这两个对象返回相同的值。
- 哈希函数的计算成本应较低。
- GetHashCode() 不应引发异常。
GetType
public Type GetType();
返回当前实例的运行时类型。
- GetType 该方法可用于返回 Type 表示的所有类型的对象。
- Object.ReferenceEquals(x.GetType(),y.GetType()) ,使用 GetType 该方法和 ReferenceEquals 该方法来确定一个x和y的类型是否相同。
- 可以利用GetType()进行反射操作。由于Mono 和 IL2CPP 会在内部缓存所有 C# 反射 (System.Reflection) 对象,并且Unity 不会对它们进行垃圾收集。此行为的结果是垃圾回收器在应用程序生命周期内持续扫描缓存的 C# 反射对象,这会导致不必要和潜在的大量垃圾回收器开销。所以我们要最大程度减少垃圾回收器开销,
不等于不能用
。
ToString
返回表示当前对象的字符串。 它将对象转换为其字符串表示形式,以便它适合显示。
ToString() 重写应遵循以下准则:
- 返回的字符串应该友好且可读。
- 返回的字符串应唯一标识对象实例的值。
- 返回的字符串应尽可能短,以便它适合由调试器显示。
- 替代 ToString() 不应返回 Empty 或返回 null 字符串。
- 替代 ToString() 不应引发异常。
- 如果实例的字符串表示形式区分区域性,或者可以通过多种方式设置格式,则实现 IFormattable 接口。
- 如果返回的字符串包含敏感信息,应首先要求适当的权限。 如果需求成功,可以返回敏感信息;否则,应返回排除敏感信息的字符串。
- 替代 ToString() 不应具有歧义性,以避免调试时出现复杂情况。 例如,对 ToString() 方法的调用不应更改实例字段的值。
- 如果类型实现分析方法 (或 Parse 方法 TryParse 、构造函数或其他一些从字符串实例化该类型的实例) 的静态方法,则应确保该方法返回 ToString() 的字符串可以转换为对象实例。
保护函数
MemberwiseClone
protected Object MemberwiseClone();
创建当前 Object 的浅表副本。
- 浅表克隆的对象是原始对象的独立副本,如果克隆对象包含引用字段,它们将共享这一字段。
- 如果字段是值类型,则执行字段的逐位克隆。 如果字段是引用类型,则会复制引用,因此,原始对象及其克隆引用同一对象。
- 浅克隆大部分情况下并不会满足我们的操作,所以我们需要深克隆:
- 调用要复制的对象的类构造函数,创建对象所需要的参数进行设置。
- 调用浅克隆方法,并对引用类型字段创建新的对象。
- 通过序列化和反序列化进行深克隆
- 将反射与递归一起使用来执行深克隆复制操作。
私有函数
Finalize
析构函数:用于垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。
- 用于在销毁对象之前对当前对象持有的非托管资源执行清理操作。
- 只能通过此类或派生类进行访问。
- 仅在给定实例上自动调用一次,除非使用机制重新注册对象。