基础知识

对于面向对象的语言来说,所有类型都是从System.Object类型派生,正是由于这个原因,保证了每个类型都有一组最基本的方法,也就是从他们的父类System.Object继承来的方法,Object的定义如下面的代码所示,System.Object所定义的基本方法中基本包含了CLR所有的方法类型,静态方法(Static修饰,属于类成员)、虚方法(Virtural修饰,属于实例成员)、实例方法(普通的方法,属于实例成员)。可能会有人说还有抽象方法,其实抽象方法最后的编译也是一个虚方法。

静态方法、实例方法和虚方法的区别

CLR的最重要的特性之一就是类型安全性,在运行时,CLR总是知道一个对象是什么类型,我们看到Object中有一个GetType方法,这个方法总是能知道一个对象的确切类型,由于GetType是一个非虚实例方法,从而保证了派生类型不能重写它,所以一个类型不可能伪装成另一个类型,其实如果我们要有意的隐藏也是可以做到的(我们可以使用New关键字覆盖GetType方法),不过一般我们不推荐这样做。

那么GetType方法是如何返回一个对象的真实类型的呢?这就要引入一个新的概念,也是是“类型对象”,当我们使用New关键字在托管堆上创建一个对象的时候,大致做了一下几件事情:

 class Program
    {
        static void Main(string[] args)
        {

            Person p = new Person("Aseven");
          
            Console.ReadKey();

        }
    }
    public class Person
    {
        private string _name;
        private int _age;

        public string Name 
        {
            get { return _name; }
            set { _name = value; }
        }
        public virtual void Say()
        {
            Console.WriteLine("******");
        }
        public static Person Find(string name)
        {
            return new Person(name);//模拟数据库查找
        }
        public int GetAge()
        {
            return _age;
        }
        public Person() { }
        public Person(string name)
        {
            this._name = name;
        }
    }
View Code

相关文章: