C#之方法的声明与调用

//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)

 

posted @ 2016-09-27 11:47  刘冠  阅读(7400)  评论(0编辑  收藏  举报