1、簡介html
Object這個類型,相信everyone都不陌生,這個是CLR定義的最基礎的類型,俗稱"上帝類"。CLR(運行時)要求全部類型,無論是系統定義的類型仍是自定義的類型,都必須從Object派生,因此如下代碼從本質上是同樣的,代碼以下:安全
/// <summary> /// 隱式派生自Object /// </summary> class Worker { } /// <summary> /// 顯式派生自Object /// </summary> class Worker : System.Object { }
由於CLR會要求全部的類型都派生自Object,因此自定義類就算沒有顯示繼承Object類,CLR仍是會讓自定義類默認繼承Object類,因爲全部的類型都從System.Object類型派生,因此每一個類型的每一個對象(實例)都會有一組最基本的方法。ide
2、Object公開的實例方法post
如下一派生自Object以後自帶的公開的實例方法:ui
上面4個方法其中Equals、ToString、GetHashCode這三個方法是虛方法,可重寫GetType是外部方法.下面來一一介紹:this
一、Equals方法url
若是兩個對象具備相同的值,就返回true,詳情請參考C# 對象相等性判斷和同一性判斷spa
二、GetHashCode方法調試
返回對象的值的哈希值,詳情請參考C# 對象哈希碼code
三、ToString方法
默認返回類型的完整名稱(this.GetType().FullName)。例如,核心類型(如Boolean和Int32)類型重寫該方法來返回他們的值的字符串表示,另外處於調試的目地而重寫該方法.調用後得到一個字符串,顯示對象各字段的值.代碼以下:
static void Main(string[] args) { var t = new Test { Name = "張三", Desc = "張三的描述", Age = 23 }; Console.WriteLine(t.ToString()); Console.ReadKey(); } public class Test { public string Name { get; set; } public string Desc { get; set; } public int Age { get; set; } public override string ToString() { var type = this.GetType(); PropertyInfo[] infos = type.GetProperties(); StringBuilder sb = new StringBuilder(); foreach (var property in infos) { if (property.GetIndexParameters().Length == 0) { string propertyName = property.Name; string propertyType = property.PropertyType.Name; var propertValue = property.GetValue(this); if (property.GetIndexParameters().Length == 0) sb.AppendFormat("屬性名:{0},屬性類型:{1},屬性值:{2}", propertyName, propertyType, propertValue); else sb.AppendFormat("當前屬性爲索引屬性,屬性名爲:{0},屬性值:{1}", propertyName, propertyType); sb.AppendLine(); } } return sb.ToString(); } }
四、GetType方法
返回從一個Type派生的一個類型的實例,指出調用GetType的那個對象是什麼類型,返回的Type對象和反射類配合,獲取與對象的類型有關的元數據信息.GetType是非虛方法,目的是防止類重寫該方法,隱瞞起類型,破壞類型的安全性,代碼以下:
public class Program { static void Main(string[] args) { var p = new Person { Name = "張三", Age = 23 }; var t = p.GetType(); var properties = t.GetProperties(); foreach (var item in properties) { var propertyName = item.Name; var propertyVal = item.GetValue(p); Console.WriteLine("屬性名:{0},屬性值:{1}", propertyName, propertyVal); } Console.ReadKey(); } } public class Person { public string Name { get; set; } public int Age { get; set; } }
3、Object受保護的方法
一、MemberwiseClone方法
這個非虛方法建立類型的新實例,並將新對象的實例字段設於this對象的實例字段徹底一致,返回對新實例的引用,代碼以下:
public class Program { static void Main(string[] args) { var p = new Person { Name = "張三", Age = 11 }; var t=p.Clone(); Console.WriteLine("this is Original object named p,the value of property named Name is {0},this value of property named Age is {1}", p.Name, p.Age); Console.WriteLine("this is clone object named t,the value of property named Name is {0},this value of property named Age is {1}", t.Name, t.Age); Console.ReadKey(); } } public class Person { public string Name { get; set; } public int Age { get; set; } public Person Clone() { return (Person)MemberwiseClone(); } }
二、Finalize方法
在垃圾回收器判斷對象應該做爲垃圾被回收以後,在對象的內存實際被回收以前,會調用這個虛方法.須要在回收內存前執行清理工做的類型應該重寫該方法.