第五回深入浅出关键字---把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()

读书笔记之第五回深入浅出关键字---把new说透的更多相关文章

  1. 《android开发艺术探索》读书笔记(十五)--Android性能优化

    接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...

  2. 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类

    请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...

  3. 读书笔记---PMBOK第五版官方中文版

    以下是为了准备PMP考试时学习<PMBOK第五版官方中文版>这本书的笔记和摘要,目的是为了以后可以快速的抓住本书的核心重点复习. 引论 PMPOK的目的 收录了项目管理知识体系中被普遍认可 ...

  4. [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 数据在mysq和hdfs之间的相互转换

    P573 从mysql导入数据到hdfs 第一步:在mysql中创建待导入的数据 1.创建数据库并允许所有用户访问该数据库 mysql -h 192.168.200.250 -u root -p CR ...

  5. 《LINUX内核设计与实现》读书笔记之第五章

    第五章——系统调用 5.1 与内核通信 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提供机制 ...

  6. OCP读书笔记(12) - 执行闪回数据库

    闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...

  7. OCP读书笔记(11) - 使用闪回技术II

    闪回归档 1. 什么是闪回数据归档? 闪回归档是用来保存一个或多个表的历史数据的新数据库对象,以及该数据的存储保留和清除策略.归档只是保存数据库中一个或多个表的所有事务处理的变化的一个或多个表空间,数 ...

  8. OCP读书笔记(10) - 使用闪回技术I

    使用闪回技术查询数据 闪回查询:就是查询表在过去某个时间点的数据,所用到的技术就是undo数据 SQL> conn scott/tiger 创建测试表 SQL> create table ...

  9. 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理

    用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...

随机推荐

  1. 微信小程序中的AJAX——POST,GET区别

    注意:发送服务器时的DATA 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String .转换规则如下: 对于 GET 方法的数据,会将数 ...

  2. Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  3. Java-JSON 解析

    JSON  JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采 ...

  4. 封装一个 员工类 使用preparedStatement 查询数据 (1)

    创建员工类  自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...

  5. python 外键用法 多对多关系 ORM操作 模板相关

    一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...

  6. mysql查看编码格式以及修改编码格式

    1.进入mysql,输入show variables like 'character%';查看当前字符集编码情况,显示如下: 其中,character_set_client为客户端编码方式: char ...

  7. PCD文件格式详解及在PCL下读取PCD文件

    一.PCD简介 1.1 PCD版本 在点云库PCL 1.0发布之前,PCD文件格式就已经发展更新了许多版本.这些新旧不同的版本用PCD_Vx来编号(例如PCD_V5.PCD_V6和PCD_V7等),分 ...

  8. [Swift]LeetCode440. 字典序的第K小数字 | K-th Smallest in Lexicographical Order

    Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. N ...

  9. 在admui中怎样上传本地文件?

    1.首先需要引入一些插件 css: <link rel="stylesheet" href="/vendor/blueimp-file-upload/jquery. ...

  10. 【译】编写支持SSR的通用组件指南

    原文来自:https://blog.lichter.io/posts/the-guide-to-write-universal-ssr-ready-vue-compon?utm_campaign=Vu ...