有时候我们要想传递可变数量的参数改怎么办??Params给我们提供了一个很好的方法
Parmas:
1.只运用方法的最后一位参数
2.这个参数只能标志任意类型的一位数组
3.添加了params这个参数的方法,该方法会添加ParamArray attribute.
下面举例说明:
static void Main(string[] args) { Console.WriteLine(GetData(new Int32[]{1,2,3,4})); Console.WriteLine(GetData(1,2,3,3)); Console.ReadKey(); } public static string GetData(params Int32[] intArray) { string result = ""; for (int i = 0; i < intArray.Count(); i++) { result += i; } return result; }
结果:1234 ,1233.
Console.WriteLine(GetData(new Int32[]{1,2,3,4}));
Console.WriteLine(GetData(1,2,3,3));
这两个使用方法时等价的。
当我们调用GetData这个方法时,CLR会查看所有Getdata()方法,发现没有具有4个参数的方法,就在查看具有ParamArray属性的Getdata方法,发现有,就调用它。就是这样!!!!
我们还可以传递不同参数类型的多个参数
static void Main(string[] args) { //Console.WriteLine(GetData(new Int32[]{1,2,3,4})); //Console.WriteLine(GetData(1,2,3,3)); GetType("nime",new Int32[]{234,342,},324); Console.ReadKey(); } public static void GetType(params object[] obj) { foreach(object o in obj) { Console.WriteLine(o.GetType()); } }
结果:
System.String
System.Int32[]
System.Int32
最后还有一点注意的,静态方法只能调用静态方法。就像上面一个,如果我把getdata方法的static除掉,就会提示 “非静态的方法或参数getdata()要求静态引用”
why??
理由很简单,静态方法可以直接用类名调用,是因为他直接在栈中,可直接拿来用。此时他所包含的参数也好,引用的方法也好都是未初始化的,就是说未给分配内存的,没给内存怎么调用
所以对于静态的方法,所调用的方法也必须是已经非配内存的静态方法!
总结:
params中的参数只能是这个参数只能标志任意类型的一维数组。
在调用的时候,为了避免重复的装箱拆箱操作,我们可以这样做:
public static string Concat(object o1){}
public static string Concat(object o1,object o2){}
public static string Concat(object o1,object o2,object o3){}
public static string Concat(params object[] args ){} (这是一个数组)
我们可以讲object改为我们需要的类型,以防止不必要的装箱和拆箱!!