《Inside C#》笔记(五) 方法
方法用来体现类的行为。
一 相关概念
a) ref和out
通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out。如果方法的参数被标注为ref或out,在调用该方法时,会传递对应的参数的指针,而不仅仅是参数的值。
ref和out的区别在于:ref参数在被传递前必须初始化,out参数则不需要。
b) 方法重载 Overloading
有了方法重载,就可以声明具有不同参数类型或个数的同名方法,可以让类的使用更灵活。另外方法重载对于构造函数也非常有用,因为构造函数名称需要与类的名称一致,如果需要声明多个构造函数,就只能用重载了。
重载的一组方法必须具有不同的参数,如果参数相同、返回值不同,则不能形成重载。
c) 可变参数
如果无法在编码时事先确定参数的个数,就可以使用可变参数,然后由系统在运行时确定。
d) 静态方法
静态方法存在于类的整个生命周期中,不必实例化也可以调用。一些比较通用的功能可以作为静态方法,封装成工具类。
二 方法的重写
a) 如果派生类需要修改从基类继承的方法,可以使用重写Override。最基本的重写可以使用new关键字。之前不知道new还有这一用处。public new或new public都可以。

b) 但使用new关键字这种重写方式只适合在派生类直接重写基类的场合。如果涉及到多态,比如将派生类视作基类,但同时又希望使用派生类重写后的方法时,new关键字就无能为力了。例如有基类Employee和方法CalculatePay,同时派生类EmployeeA中使用new关键字重写了CalculatePay方法,编译后的IL码会直接指向基类的CalculatePay()

产生这种现象是由于编译器进行了“早绑定”early binding。在代码编译时,编译器会寻找对CalculatePay()的调用,并确定调用CalculatePay()时会跳转到的地址,使用new的写法时,编译器会直接指定跳转到基类的CalculatePay()地址。
c) 那么如何使派生类使用自己重写的方法呢?可以使用virtual和override关键字,这两个关键字可以告知编译器进行“晚绑定”late binding,在运行时才确定要调用CalculatePay()时要跳转的地址。在基类的方法上添加virtual以及在派生类的相应方法上添加override后,IL码变成了如下:

callvirt表示编译时CalculatePay()方法的地址未知,只有在运行时根据具体的派生类来确定
《Inside C#》笔记(五) 方法的更多相关文章
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- Linux学习笔记(五) 账号管理
1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...
- DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS
原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...
随机推荐
- 《JavaScript面向对象编程指南》读书笔记①
概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看 ...
- Python编程语言基础
今天给大家讲解python语言基础~~ 01.python核心数据类型 整型数 int:整数是不带有小数部分的数字 浮点型数 float:浮点数是带有小数部分的数字(小数部分可以是0) 复数 co ...
- 机器学习库--dlib
dlib是什么呢?见面了,总要认识一下吧? dlib其实就是一个跨平台的用C++编写的代码库.这个库的机器学习算法和工具可以用来解决现实世界的很多工程问题. 它在工业界和学术界有着广泛的应用.主要在机 ...
- [EXP]Apache Superset < 0.23 - Remote Code Execution
# Exploit Title: Apache Superset < 0.23 - Remote Code Execution # Date: 2018-05-17 # Exploit Auth ...
- Kafka项目实战-用户日志上报实时统计之编码实践
1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...
- Python sqlalchemy的基本使用
示例代码 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base fr ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
- 线段树(segment tree)
线段树是一种二叉搜索树,它的每一个结点对应着一个区间[L, R],叶子结点对应的区间就是一个单位区间,即L == R.对于一个非叶子结点[L, R],它的左儿子所表示的区间是[L, (L +R)/2] ...
- MAC ACL、RACL和VACL
拓扑结构: 配置IP地址.VLAN及路由: SW1(config)#int range f0/1 - 2SW1(config-if-range)#switchport mode accessSW1(c ...
- Keepalived原理与实战精讲
什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ...