C#每日一课(十一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/advent86/article/details/82982939

C#方法

一个方法是把一些相关逻辑的语句组织在一起,用来执行一个任务的语句块。

使用方法过程

  1. 定义方法
  2. 调用方法

 

C#中定义方法

定义一个方法从根本上来说是声明它的结构元素,C#中定义方法的语句如下

<Access Specifier> <Return Type> <Method Name>(Parameter List)

{

Method Body

}

Access Specifier:它是一个访问修饰符,这个修饰符决定了它对另一个类的可见性

扫描二维码关注公众号,回复: 3929573 查看本文章

Return Type:返回值类型,一个方法可以返回一个值。如果一个方法不返回任何值则返回类型设置为void

Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其它标识符相同。

Parameter list:参数列表,使用圆括号括起来,参数是用来传递和接收方法的数据,参数列表包含了参数的类型、顺序和数量。这里的参数是可选的,一个方法可以没有任何方法

Method body:方法的主体部分,也就是方法要实现的逻辑

 

在visual studio当中新建一个项目,在新建的项目中可以添加如下方法

/**

         * 最后修改时间:2018-09-13

         * 最后修改人:xiesheng

         * 函数名称:findMax

         * 返回值类型:int

         * 参数说明:ArrayList

         * 函数说明:用来获取一个ArrayList<int>中各个元素的最大值并返回

         */ 

        public static int FindMax(ArrayList arr)

        {

            /*声明一个局部变量*/

            int max = 0;

            foreach (int i in arr)

            {

                if (max < i)

                {

                    max = i;

                }

            }

            return max;

        }

C#中对方法的调用

在Main方法中添加如下代码:

/*主函数*/

        static void Main(string[] args)

        {

            ArrayList arr = new ArrayList();

            arr.Add(12);

            arr.Add(10);

            arr.Add(-2);

            arr.Add(9);

            Console.WriteLine("max = {0}", FindMax(arr));

            Console.ReadKey();

}

编译执行后结果如下:

上面的过程是把findMax()方法和Main()方法放在同一个类中,也可以把方法单独放在一个类当中,然后在Main()方法中实列化这个类,然后调用这个类的方法(可参考C#每日一课十)。

 

C#中递归方法调用

当一个方法进行自我调用时,这个就是所谓的递归。

新增一个计算阶乘的方法如下:

/**

         * 最后修改时间:2018-09-13

         * 最后修改人:xiesheng

         * 函数名称:factorial

         * 返回值类型:long

         * 参数说明:int

         * 函数说明:返回指定数量的阶乘值

         */

        public static long Factorial(int num)

        {

            /*局部变量*/

            long result = 0;

            if (num == 1)

            {

                result = 1;

            }

            else

            {

                result = Factorial(num - 1) * num;

            }

            return result;

   }

此方法在Main方法中做如下调用:

/*验证递归调用*/

Console.WriteLine("1的阶乘是:{0}", Factorial(1));
Console.WriteLine("6的阶乘是:{0}",Factorial(6));
Console.WriteLine("7的阶乘是:{0}", Factorial(7));
Console.WriteLine("8的阶乘是:{0}", Factorial(8));

 

编译运行后的结果如下:

 

C#中参数传递

C#中有三种向方法传递参数的方式

  1. 值参数

这种方式会复制参数的实际值给到函数的形式参数,实参和形参使用的是两个不同的内存中的值。在这种情况下,当形参的值发生改变时,不会影响到实参值从而保证了实参数据的安全。

  1. 引用参数

这种方式复制参数的内存位置的引用给形式参数。意味着,当形参的值发改变 的时候同时也会改变实参的值。

  1. 输出参数

可以用来返回多个值

 

按值传递参数

这种传递方式是默认的传递方式,当调用一个方法时,会为每个值参数创建一个新的存储位置。

实参的值会复制给到形参,实参与形参两者使用的是两个不同的内存中的值。所以,当形参值发生改变时,不会影响到实参的值,从而保证实参数据的安全性。

在类中加入如下方法:

// 值传递函数

        public static void Swap(int x, int y) {

            int temp;

            temp = x;

            x = y;

            y = temp;

            Console.WriteLine("函数交换后在方法中的值如下:x={0},y={1}",x,y);

}

在Main方法中做如下调用方法

int x = 100, y = 200;

//值传递调用

Console.WriteLine("--------------值传递调用----------------");

Console.WriteLine("函数执行交换前的值如下:x={0},y={1}",x,y);

Swap(x, y);

Console.WriteLine("函数执行交换后的值如下:x={0},y={1}", x, y);

编译执行后的结果如下:

从上面的结果可以看到,在方法调用前后方法调用后实参的值是没有做任何变化的,但在方法中做了形参内容的主变化。

按引用传递参数

引用参数是一个对变量的内存位置的引用。当使用引用传递参数值时,与值参数不同的是,它不会为形参创建新的存储位置。引用参数表示提供给方法的实际参数具有相同的内存位置。

在C#中使用ref关键字来声明引用参数。

在类中新增方法如下:

// 引用参数

        public static void Swap(ref int x, ref int y) {

            int temp;

            temp = x;

            x = y;

            y = temp;

            Console.WriteLine("函数交换后在方法中的值如下:x={0},y={1}", x, y);



}

 

在Main方法中调用这个引用传参方法

//引用传递调用

Console.WriteLine("--------------引用传递调用----------------");

Console.WriteLine("函数执行交换前的值如下:x={0},y={1}", x, y);

Swap(ref x, ref y);

Console.WriteLine("函数执行交换后的值如下:x={0},y={1}", x, y);

编译执行结果如下:

从执行的结果可以看到,在方法中对参数的改变最终影响到了实参的值,因为这个时候使用引用传参会使形参和实参指向同一个内存地址,当形参改变的时对应内存地址上的值就是发生变化。

按输出参数传递参数

在方法中return语句只可以返回一个值。但是可以使用输出参数来返回两个值。输出参数会把方法输出的数据赋给自己,其它的方面与引用参数类似。

在类中添加如下方法:

//输出参数

        public static int MaxAndMin(out int min, ArrayList list) {

            int max;

            max = Int32.Parse(list[0].ToString());

            foreach(int i in list) {

                if (max <= i) {

                    max = i;

                }

            }

            min = Int32.Parse(list[0].ToString());

            foreach (int i in list) {

                if (min >= i) {

                    min = i;

                }

            }

            return max;

}

 

在Main方法加入如下代码进行方法调用:

//输出参数

Console.WriteLine("--------------输出参数调用----------------");

ArrayList arr1 = new ArrayList();

arr1.Add(100);

arr1.Add(38);

arr1.Add(-2);

arr1.Add(98);

int min = 0, max = 0;

max = MaxAndMin(out min,arr1);

Console.WriteLine("调用方法前数组中最大值:{0}",max);

Console.WriteLine("调用方法前数组中最小值:{0}",min);

编译运行后结果如下:

其中可以看到,方法在具有返回值的同时,可以在参数中加入输出参数(out标识符标识)。

猜你喜欢

转载自blog.csdn.net/advent86/article/details/82982939