《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()方法的地址未知,只有在运行时根据具体的派生类来确定

 

posted @ 2017-06-20 21:34  zhixin9001  阅读(184)  评论(0编辑  收藏  举报