博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读书笔记之第五回深入浅出关键字---把new说透
阅读量:5154 次
发布时间:2019-06-13

本文共 1904 字,大约阅读时间需要 6 分钟。

      第五回深入浅出关键字---把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作为运算符的作用之一,具体可以参考: 
     
  • 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关键字来实现,并且执行结果是同样的,你可以试试看。 
    关于父类、子类的继承机制是如何实现的,请参阅作者的另一篇拙作《继承本质论》,相信能够给你更清晰的解释: 
     

  • 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

你可能感兴趣的文章
面试整理:Python基础
查看>>
Python核心编程——多线程threading和队列
查看>>
Program exited with code **** 相关解释
查看>>
植物大战僵尸中文年度版
查看>>
26、linux 几个C函数,nanosleep,lstat,unlink
查看>>
投标项目的脚本练习2
查看>>
201521123107 《Java程序设计》第9周学习总结
查看>>
Caroline--chochukmo
查看>>
利用jquery的contains实现搜索功能
查看>>
iOS之文本属性Attributes的使用
查看>>
从.Net版本演变看String和StringBuilder性能之争
查看>>
Excel操作 Microsoft.Office.Interop.Excel.dll的使用
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
【bzoj2788】Festival
查看>>
执行gem install dryrun错误
查看>>
Java SE之正则表达式一:概述
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>