关于参数

小结:

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#中,只是名字不同是区分不了这两个索引的,只要参数类型不同就可以区分。换句话说,是依据参数类型的不同来区分索引的,不关索引名字的事。
原文地址:https://www.cnblogs.com/notebook2011/p/2932863.html