Q-->question A-->answer M-->mention
The Chapter 8th Method
M:内联代码的优点==>
其可以使JIT编译器优化代码,移除额外的方法调用,从而提高代码运行时的性能.
M:类型转换==>若需要转换为基元类型时,编译器知道如何生成转换对象的代码.
M:CRL支持仅返回值不同而其他全一样的方法签名,如在转换操作符就出现此情况.
M:CLR允许使用按引用传递参数来取代按值传递参数,C#中使用关键字out或ref,它在生成的元数据中表明为引用类型
Q:out与ref的区别?
A:1.初始化=>ref为调用者实例化,out为被调用者实例化
2.值=>out在返回之前必须为变量赋值,ref为调用者必须先给它赋值,但从CLR的角度看它们等效
M:CLR允许基于方法对out和ref参数的使用来重载方法(指和其他方法),但不允许存在out和ref区别的重载,因为其元数据表示是相同的.
for example==> void M1(out Point p)和void M1(Point p) //通过
void M2(out Point p)和void M2(ref Point p) //不允许
M:checked和unchecked使用准则==>
1.写代码时,将可能发生非预期溢出的代码放到一个checked中
2.写代码时,将允许发生溢出的代码显示置入unchecked中,如校验和
3.对于未使用上述两个关键字,希望在发生溢出时抛出一个异常
M:在使用ref参数时,必须确保实参类型和形参类型完全一致,否则不能通过编译,如string不能隐式转换到object,但可以通过泛型来解决<T>
Q:何为可变数量的参数?
A:1.只有方法的最后一个参数才能标记为可变的,用params标记
2.该参数必须标记为一维数组,但类型不限
3.任意数量,任意类型的参数用object[]
4.对可变参数调用会造成一定性能损失,因为其必须在堆上分配内存以及引起GC
M:声明方法参数类型时,应尽可能地指定最弱的类型,并且最好在其基类上定义接口,如:IEnumerable<T>好于IList<T>,而在声明返回类型时应昼为最强类型,如FileStream好于Stream
M:CLR不支持常量方法和参数(也就是参数或方法的关键字const修饰符)
encapsulation 封装