方法用来体现类的行为。

一 相关概念

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#》笔记(五) 方法的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  6. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  7. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  8. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

  9. DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

    原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...

随机推荐

  1. itext实现合同尾部签章部分自动添加,定位签名

    使用的pom <!-- pdf处理 start--> <dependency> <groupId>com.itextpdf</groupId> < ...

  2. Shell-10--if

  3. 【Spark调优】:尽量避免使用shuffle类算子

    如果有可能的话,尽量避免使用shuffle类算子.因为Spark作业运行过程中,最消耗性能的地方就是shuffle过程.shuffle过程,就是将分布在集群中多个节点上的同一个key,拉取到同一个节点 ...

  4. 干货—MySQL常见的面试题+索引原理分析!

    目录 MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引. 问:为什么加索引能优化慢查询? 同学A:...不知道 ...

  5. debian安装tftp服务

    步骤1:安装 apt-get install tftp-hpa tftpd-hpa tftp-hpa是client,tftpd-hpaserver 步骤2:建立tftp目录 mkdir /tftpbo ...

  6. Maven - 实例-6-聚合与继承

    创建项目 xxx - 继承自testDep.PPP <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi= ...

  7. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  8. vuex的module的简单实用方法

    当我们的项目越来越大的时候,我们就开始使用vuex来管理我们的项目的状态.但是如果vuex的状态多了呢,这个时候module就登场了.看了一下官方的文档,很详细,但是没有demo让初学者很头疼.那我就 ...

  9. postgresql-分页数据重复问题探索

    postgresql-分页数据重复探索 问题背景 许多开发和测试人员都可能遇到过列表的数据翻下一页的时候显示了上一页的数据,也就是翻页会有重复的数据. 如何处理? 这个问题出现的原因是因为选择的排序字 ...

  10. redis epoll 原理梗概

    redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量.为什么 Redis 中要使用 I/O 多路复用这 ...