//params关键字使用
class Program { static void Main(string[] args){ int[] arr = { 10, 20, 30,60 }; Console.WriteLine(AddFunction(arr)); Console.WriteLine(AddFunction(10,20,30,60)); Console.ReadKey(); } static int AddFunction(params int[] values ) { int temp = 0; foreach (var item in values) { temp += item; } return temp; }
实现了一个AddFunction方法,用于接收一组整数,并返回它们的和。参数values被加上params关键字后,在调用时可以在实参列表中列举出这组整数中的每个元素,非常方便。
关于params关键字的用法,需要注意以下几点:
1. params只能用于一维数组,不能用于多维数组和诸如ArrayList、List<T>等任何类似于数组的集合类型。
2. 被加上params关键字的形参,必须是形参列表中最后一个形参,并且方法声明中只允许一个 params 关键字。
3. 用params关键字的方法,有三种调用形式:
第一种,列举出数组各元素:AddFunction(1,2,3),这也是最常用的形式;
第二种,像没有加params关键字的数组形参那样,用数组名做实参:AddFunction(new int[]{1,2,3})或int n=new int[]{1,2,3};AddFunction(n);;
第三种,加params关键字的参数在调用时可以省略:AddFunction();//返回0;这种方式有时可以少定义一个方法重载,但当明确定义了重载int AddFunction()时,编译器会优先调用int AddFunction(),而不是AddFunction(params int[] values)。而且省略params型参数,方法内部仍会new一个元素个数为0的数组,效率略查。
第四种,不省略params型参数,用null代替,效率比第三种略高,因为其内部不会new这个数组。
ref关键字使用
static void Main(string[] args){ string ss = "1-425-42-4-2-5"; change(ref ss); Console.WriteLine(ss); Console.ReadKey(); } static void change(ref string value) { string[] strArray = value.Split('-'); value = String.Join("+",strArray); }
out关键字的使用(经过试验:out,ref可以混用(在注意语法的前提下))
static void Main(string[] args){ int[] arr = { 50,56,23,45656,146,2353566,1633,22}; int indexOut = 0;//ref:要初始化,out:不用初始化 Console.WriteLine("最大值{0},索引是{1}",MaxNumber(arr,ref/*out*/ indexOut),indexOut); Console.ReadKey(); } static int MaxNumber(int[]values ,ref/*out*/ int index) { int max = values[0]; index = 0; for (int i = 0; i < values.Length; i++) { if (max < values[i]) { max = values[i]; index = i; } } return max; }
二者区别与联系
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,ref是有进有出,out是只出不进。
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
静态方法与实例方法
静态方法只能访问类中的静态成员,实例方法可以访问类中的任何成员
虚方法(virtual) 重写虚方法(override) 不允许重写(sealed)外部方法(DllImport)