读书笔记之第五回深入浅出关键字把new说透

      第五回深入浅出关键字---把new说透  ------你必须知道的.net读书笔记

  • new一个class时,new完成了以下两个方面的内容:一是调用newobj命令来为实例在托管堆中分配内存;二是调用构造函数来实现对象初始化。
  • new一个struct时,new运算符用于调用其带构造函数,完成实例的初始化。
  • new一个int时,new运算符用于初始化其值为0。
  • 另外必须清楚,值类型和引用类型在分配内存时是不同的,值类型分配于线程的堆栈(stack)上,并变量本身就保存其实值,因此也不受GC的控制,;而引用类型变量,包含了指向托管堆的引用,内存分配于托管堆(managed heap)上,内存收集由GC完成。 

另外还有以下规则要多加注意:

  • 1、new运算符不可重载。
  • 2、new分配内存失败,将引发OutOfMemoryException异常。 
  • 3、将基类方法实现为virtual,有利于版本的向前发展和向后兼容,在子类中通过new或者override实现对其的覆写或隐藏。因此,从版本控制的角度而言,将基类方法实现为virtual是必须的。 
  • 4、int i 和 int i = new int()作为类的成员,也就是字段定义时,是没有区别的,因为会自动完成初始化,此时的int i中的i被默认为0;而如果int i和int i = new i()作为一个方法的变量定义时,二者是有区别的,此时的new i()会进行初始化处理,这是new作为运算符的作用之一,具体可以参考: 
    http://www.cnblogs.com/anytao/archive/2007/12/03/must_net_18.html 
  • 5、值类型是执行initobj指令。功能是将位于指定地址的对象的所有字段 初始化为空引用或适当的基元类型的0 。然后该实例可用于要被调用的构造函数,与Newobj不同,构造函数不是由initobj调用的(不太明白,还要仔细斟酌
  • 6、IntNumber intNum = new IntNumber(); 
    intNum.ShowInfo(); 

    ShowInfo方法在基类Number中已经有定义,但不是虚方法,所以子类方法中如果定义了同样的名称的方法,从设计者的角度来看,这样做的目的不是重写父类的ShowInfo,因为不是虚方法。所以,只能是表示该方法ShowInfo是区别于父类的方法,你可以理解为ShowInfo2,虽然同名但是在编译器看来这两个方法是完全不同的两个方法。因此父类对象number在调用ShowInfo时,它调用的显然是Number::ShowInfo(),而子类对象intNumber在调用ShowInfo时,调用的就是IntNumber::ShowInfo()。 

    这就是new关键字作为隐藏基类方法时的作用。.NET默认就是提供了new的,因此在子类中如果没有显式指明,会给出警告同时编译器会自动加上new来隐藏基类的同名方法。 
    另外,如果在基类的ShowInfo被定义为virtual,而在子类中如果想隐藏而不是覆写父类方法,则还是使用new关键字来实现,并且执行结果是同样的,你可以试试看。 

    关于父类、子类的继承机制是如何实现的,请参阅作者的另一篇拙作《继承本质论》,相信能够给你更清晰的解释: 
    http://www.cnblogs.com/anytao/archive/2007/09/10/must_net_15.html 

  • 7、

    比如一个类ClassA实现了一个接口IHello,IHello中定义了一个方法F()下列语句: 
    ClassA c = new ClassA(); 
    ((IHello)c).SayHello()和c.SayHello() 有什么区别吗?还是希望您能给做一个透彻的解释,不胜感激! 

    public interface IHello 

    void SayHello(); 


    public class A : IHello 

    public void SayHello() 

    Console.WriteLine("This is SayHello()"); 


    void IHello.SayHello() 

    Console.WriteLine("This is IHello.SayHello()"); 



    public class Test_Interface 

    public static void Main() 

    A a = new A(); 

    a.SayHello(); 
    ((IHello)a).SayHello(); 



    结果自然告诉了答案,至于为什么,就等下次以专题来分析吧:-) 

    结果显示:

    This is SayHello()

    This is IHello.SayHello()         

原文地址:https://www.cnblogs.com/hhhjzg/p/9566721.html