《Inside C#》笔记(五) 方法

办法用来呈现类的行事。

一 相关概念

a) ref和out

平凡2个办法只好再次回到一个值,但只要实在供给回到五个值时,可以应用ref或out。假诺艺术的参数被标明为ref或out,在调用该格局时,会传递对应的参数的指针,而不仅是参数的值。

ref和out的差异在于:ref参数在被传送前必须初始化,out参数则不要求。

 

b) 方法重载 Overloading

有了主意重载,就足以申明具有不相同参数类型或个数的同名方法,能够让类的利用更灵活。其它方法重载对于构造函数也优秀有用,因为构造函数名称须求与类的称呼相同,即使需求评释多少个构造函数,就不得不用重载了。

重载的一组方法必须持有不一样的参数,要是参数相同、重返值不相同,则无法形成重载。

 

c) 可变参数

假设不可能在编码时事先分明参数的个数,就足以应用可变参数,然后由系统在运营时规定。

 

d) 静态方法

静态方法存在于类的整套生命周期中,不必实例化也足以调用。一些相比通用的效劳能够当作静态方法,封装成工具类。

 

二 方法的重写

a)
倘使派生类供给修改从基类继承的法子,能够使用重写Override。最基本的重写能够应用new关键字。此前不清楚new还有这一用处。public
new或new public都得以。

 C# 1

 

b)
但使用new关键字这种重写方式只适合在派生类直接重写基类的场子。就算涉嫌到多态,比如将派生类视作基类,但与此同时又愿意利用派生类重写后的办法时,new关键字就不可能了。例如有基类Employee和措施CalculatePay,同时派生类EmployeeA中动用new关键字重写了CalculatePay方法,编译后的IL码会直接指向基类的CalculatePay()

C#, C# 2

 

发生那种现象是由于编写翻译器进行了“早绑定”early
binding。在代码编写翻译时,编写翻译器会寻找对CalculatePay()的调用,并规定调用CalculatePay()时会跳转到的地方,使用new的写法时,编写翻译器会直接钦定跳转到基类的CalculatePay()地址。

 

c)
那么如何使派生类使用本身重写的法门呢?能够应用virtual和override关键字,那多少个第三字能够告知编写翻译器举办“晚绑定”late
binding,在运维时才规定要调用CalculatePay()时要跳转的地方。在基类的法门上添加virtual以及在派生类的相应措施上添加override后,IL码变成了之类:

 C# 3

 

callvirt表示编写翻译时CalculatePay()方法的位置不详,唯有在运维时遵照现实的派生类来明确

 

相关文章