C# 終極基類Object介紹

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方法

在垃圾回收器判斷對象應該做爲垃圾被回收以後,在對象的內存實際被回收以前,會調用這個虛方法.須要在回收內存前執行清理工做的類型應該重寫該方法.

相關文章
相關標籤/搜索