《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 ...
随机推荐
- python中实现排序list
作为一个非常实用的一种数据结构,排序链表用在很多方面,下面是它的python代码实现: from Node import * class OrderedList: def __init__(self) ...
- Tools - Vim
Vim 简明 Vim 练级攻略 基础设置 在vim界面点击":"然后进行设置,但只会在当前vim界面生效: 添加相关设置在vim配置文件(例如"/etc/vimrc&qu ...
- Xamarin.Android 使用线程无法更改页面文本问题
前言: 刚接触Xamarin.Android不到一个月时间,却被他折磨的不要不要的,随着开发会出现莫名其妙的问题,网上类似Xamarin.Android的文档也不多,于是本片文章是按照Java开发An ...
- 21天打造分布式爬虫-Crawl类爬取小程序社区(八)
8.1.Crawl的用法实战 新建项目 scrapy startproject wxapp scrapy genspider -t crawl wxapp_spider "wxapp-uni ...
- Python:SQLMap源码精读—start函数
源代码 def start(): """ This function calls a function that performs checks on both URL ...
- vue页面参数闪一下的问题
解决方法: 直接在外层元素加上v-cloak <div id='app' v-cloak></div>
- SVM笔记
1.前言 SVM(Support Vector Machine)是一种寻求最大分类间隔的机器学习方法,广泛应用于各个领域,许多人把SVM当做首选方法,它也被称之为最优分类器,这是为什么呢?这篇文章将系 ...
- Tensorflow学习笔记(2):tf.nn.dropout 与 tf.layers.dropout
A quick glance through tensorflow/python/layers/core.py and tensorflow/python/ops/nn_ops.pyreveals t ...
- 经济学人使用Golang构建微服务历程回顾
关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...
- 基于 CGLIB 库的动态代理机制
之前的文章我们详细的介绍了 JDK 自身的 API 所提供的一种动态代理的实现,它的实现相对而言是简单的,但是却有一个非常致命性的缺陷,就是只能为接口中的方法完成代理,而委托类自己的方法或者父类中的方 ...