方法用来体现类的行为。

一 相关概念

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. ElasticSearch权威指南学习(分布式文档存储)

    路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...

  2. rocketmq自启动配置

    捣鼓rocketmq自启动半天发现是启动脚本里没有声明java环境 现记录下 脚本 #!/bin/bash export JAVA_HOME=/opt/data/jdk1.8/jdk1.8.0_161 ...

  3. 11-部署Heapster插件

    配置和安装 Heapster 到 heapster release 页面 下载最新版本的 heapster. $ wget https://github.com/kubernetes/heapster ...

  4. scrapy爬虫--苏宁图书

    实现业务逻辑如下: 1. 创建scrapy项目,并生成 爬虫2. 在suning.py中实现Schedul 和 Spider业务逻辑3. 修改start_urls为正确的初始请求地址4. 构造pars ...

  5. hive中的子查询改join操作(转)

    这些子查询在oracle和mysql等数据库中都能执行,但是在hive中却不支持,但是我们可以把这些查询语句改为join操作: -- 1.子查询 select * from A a where a.u ...

  6. Windows下memcache的配置和使用(python)

    1.memcache的安装和配置: 下载memcache  for windows: http://up.2cto.com/2012/0522/20120522094758371.rar 解压到指定目 ...

  7. Android中服务的生命周期与两种方式的区别

    服务的生命周期跟Activity的生命周期类似.但是生命周期甚至比你关注服务如何创建和销毁更重要,因为服务能够在用户不知情的情况下在后台运行. 服务的生命周期---从创建到销毁---可以被分为以下两个 ...

  8. Linux压力测试软件Stress安装及使用

    一.安装 yum install -y epel-release yum install stress -y 二.参数说明 -? --help 显示帮助信息 --version 显示软件版本信息 -t ...

  9. C语言第三讲,基本数据类型

    C语言第三讲,基本数据类型 一丶基本数据类型讲解 在C语言当中,有四种基本数据类型 分别是: 整形 浮点型 指针 聚合类型(数组和结构) 整型家族包括: 字符 短整型 整形 长整型 ** 都分为有符号 ...

  10. asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与)

    Visual Studio.net 2013 asp.net MVC 5 Scaffolding代码生成向导开源项目 提高开发效率,规范代码编写,最好的方式就是使用简单的设计模式(MVC , Repo ...