关于参数
小结:
1. 按引用传递参数
在C#中可以使用关键字out或ref来实现按引用传递参数,从CLR的角度看,out与ref生成的元数据及IL代码都是相同的。
a. out参数在传值前可以先赋值也可以不赋,但在方法返回时必须被赋值
b. ref参数在传值前必须先赋值,在方法返回时可以修改其值
c. 重载仅存在out和ref差异的方法是不合法的,因为这两个方法签名的元数据表示是相同的。如:
public sealed class Point{ static void Add(out Int32 sx){...} static void Add(ref Int32 sx){...} }//这是不允许的
d. 按引用传递给方法的变量类型必须要与方法签名中参数类型相同
例子:交换两个引用类型变量的方法
public static void Swap(ref Object o1, ref Object o2) { Object t = o1; o1 = o2; o2 = t; } 调用1: public void DoSomething() { String s1 = "s1 text"; String s2 = "s2 text"; Swap(ref s1, ref s2);//编译器会提示有不合法的参数 } 调用2: public void DoSomething() { String s1 = "s1 text"; String s2 = "s2 text";
//要先转换成Swap声明中参数的类型 Object o1 = s1; Object o2 = s2; Swap(ref o1, ref o2);//通过编译 }
2. 参数数组
public Int32 Add(params Int32[] values){...}
a. 用params修饰的参数必须放在所有参数的后面【最后一个参数】,在传值时,可以传0个或多个值,也可以传null 值
b. 使用参数数组时,是有损耗性能的,毕竟它是一个数组类型【引用类型】,在heap上分配空间,数组中的元素必须初始化,用完之后这个数组空间要被GC收回
3.方法返回值与方法参数的设计规则
a. 对于方法参数,采用弱参数类型较好,如:
public void DoSomething(Stream someStream) {...} ----弱参数类型:此方法可以处理任何一种Stream类型,限制宽松,即可以是FileStream、NetworkStream、MemoryStream等, public void DoSomething(FileStream fileStream) {...} ----强参数类型:此方法只能处理FileStream一种类型,限制太死
b. 对于方法的返回值,一般采用强类型较好,即限制较死
public FileStream OpenFile() { ...} ----强类型 public Stream OpenFile() { ...} ----弱类型
4. 索引
public Int32 this[Boolean b] { get { return 0; } } public String this[Boolean b] { get { return null; } }
----在C#中,只是名字不同是区分不了这两个索引的,只要参数类型不同就可以区分。换句话说,是依据参数类型的不同来区分索引的,不关索引名字的事。