读书笔记之第五回深入浅出关键字---把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()
读书笔记之第五回深入浅出关键字---把new说透的更多相关文章
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...
- 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类
请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...
- 读书笔记---PMBOK第五版官方中文版
以下是为了准备PMP考试时学习<PMBOK第五版官方中文版>这本书的笔记和摘要,目的是为了以后可以快速的抓住本书的核心重点复习. 引论 PMPOK的目的 收录了项目管理知识体系中被普遍认可 ...
- [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 数据在mysq和hdfs之间的相互转换
P573 从mysql导入数据到hdfs 第一步:在mysql中创建待导入的数据 1.创建数据库并允许所有用户访问该数据库 mysql -h 192.168.200.250 -u root -p CR ...
- 《LINUX内核设计与实现》读书笔记之第五章
第五章——系统调用 5.1 与内核通信 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提供机制 ...
- OCP读书笔记(12) - 执行闪回数据库
闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...
- OCP读书笔记(11) - 使用闪回技术II
闪回归档 1. 什么是闪回数据归档? 闪回归档是用来保存一个或多个表的历史数据的新数据库对象,以及该数据的存储保留和清除策略.归档只是保存数据库中一个或多个表的所有事务处理的变化的一个或多个表空间,数 ...
- OCP读书笔记(10) - 使用闪回技术I
使用闪回技术查询数据 闪回查询:就是查询表在过去某个时间点的数据,所用到的技术就是undo数据 SQL> conn scott/tiger 创建测试表 SQL> create table ...
- 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理
用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...
随机推荐
- 关于分页器border重叠问题
.paging li { cursor: pointer; display: inline-block; float: left; box-sizing: border-box; margin-lef ...
- 长沙学院APP
一.开发背景 作为一名长大学子,我认为我们学校没有一个自己专属的手机APP是一件遗憾的事情,虽然大部分的211,985高校也没有一个自己专属的APP,所以,要是我们学校能开发一个出来,那逼格肯定就不一 ...
- 简单实用而不追求时髦的 Vim 配置
前言 由于 Vim 的广泛流行,在网络上关于 Vim 的自定义配置汗牛充栋.既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/s ...
- Redis两种方式实现限流
案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int ...
- VsCode 使用专用编程字体FiraCode
FiraCode资料:https://github.com/tonsky/FiraCode PHP代码效果如下: VsCode 配置中添加: "editor.fontFamily" ...
- [Swift]LeetCode92. 反转链表 II | Reverse Linked List II
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- 优化之XML组件
可在XML Parser 组件和XML Source定义中删除非project group,因为不需为这些非project group分配内存,但需要维护主键外键约束 ________________ ...
- 10.Git分支-分支管理(git branch命令)、分支开发工作流
1.分支管理 git branch 不仅可以创建和删除分支,还可以做一些其他工作. 1.不带参数的 git branch ,得到本地仓库当前的分支列表.并且会显示,当期所在的分支,也就是HEAD所指 ...
- 如何写好CSS系列之表单(form)
表单模块可以分为两部分:一是表单的布局,也就是规范表单元素单元的排列位置:二是表单元素,如:输入框.单选.复选.列表组件.搜索组件等,由于列表组件.搜索组件不是单纯的css组件,所以暂且没有实现. 一 ...
- oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置
oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置 在上一节我们讲述的配置是把授权码存储在redis中,把相应的请求的路径用使用in-memory存储 ,这个是 ...