上一节:
下一节:

  C# 方法

  • 方法

    方法是一起执行任务的一组语句。每个 C# 程序至少都有一个类,带有一个名为Main的方法。要使用一种方法,您需要-
    • 定义方法
    • 调用方法
  • C# 中的定义方法

    定义方法时,基本上是声明其结构的元素。在 C# 中定义方法的语法如下-
    
    <Access Specifier> <Return Type> <Method Name>(Parameter List) {
       Method Body
    }
    
    以下是方法的各个要素-
    • Access Specifier - 确定另一个类中的变量或方法的可见性。
    • Return Type - 方法可以返回一个值。返回类型是方法返回的值的数据类型。如果该方法未返回任何值,则返回类型为void。
    • Method Name - 方法名称是唯一标识符,区分大小写。它不能与该类中声明的任何其他标识符相同。
    • Parameter List - 用括号括起来的参数用于传递和接收方法的数据。参数列表是指方法的参数的类型,顺序和数量。参数是可选的;也就是说,一个方法可以不包含任何参数。
    • Method Body - 这包含完成所需活动所需的一组指令。
    以下代码段显示了一个函数FindMax,该函数采用两个整数值并返回两个中较大的一个。它具有公共访问说明符,因此可以使用类的实例从类外部进行访问。
    
    class NumberManipulator {
    
       public int FindMax(int num1, int num2) {
          /* local variable declaration */
          int result;
    
          if (num1 > num2)
             result = num1;
          else
             result = num2;
    
          return result;
       }
       ...
    }
    
  • C# 中的调用方法

    您可以使用方法名称来调用方法。以下示例说明了这一点-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public int FindMax(int num1, int num2) {
             /* local variable declaration */
             int result;
             
             if (num1 > num2)
                result = num1;
             else
                result = num2;
             return result;
          }
          
          static void Main(string[] args) {
             /* local variable definition */
             int a = 100;
             int b = 200;
             int ret;
             NumberManipulator n = new NumberManipulator();
    
             //calling the FindMax method
             ret = n.FindMax(a, b);
             Console.WriteLine("Max value is : {0}", ret );
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Max value is : 200
    
    您还可以使用该类的实例从其他类调用public方法。例如,方法FindMax属于NumberManipulator类,您可以从另一个类Test调用它。
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public int FindMax(int num1, int num2) {
             /* local variable declaration */
             int result;
             
             if(num1 > num2)
                result = num1;
             else
                result = num2;
             
             return result;
          }
       }
       class Test {
          static void Main(string[] args) {
             /* local variable definition */
             int a = 100;
             int b = 200;
             int ret;
             NumberManipulator n = new NumberManipulator();
             
             //calling the FindMax method
             ret = n.FindMax(a, b);
             Console.WriteLine("Max value is : {0}", ret );
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Max value is : 200
    
  • 递归方法调用

    方法可以自行调用。这称为递归。以下是使用递归函数为给定数字计算阶乘的示例-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public int factorial(int num) {
             /* local variable declaration */
             int result;
             if (num == 1) {
                return 1;
             } else {
                result = factorial(num - 1) * num;
                return result;
             }
          }
          static void Main(string[] args) {
             NumberManipulator n = new NumberManipulator();
             //calling the factorial method {0}", n.factorial(6));
             Console.WriteLine("Factorial of 7 is : {0}", n.factorial(7));
             Console.WriteLine("Factorial of 8 is : {0}", n.factorial(8));
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Factorial of 6 is: 720
    Factorial of 7 is: 5040
    Factorial of 8 is: 40320
    
  • 将参数传递给方法

    调用带有参数的方法时,需要将参数传递给方法。参数可以通过三种方式传递给方法-
    按值传递
    这是将参数传递给方法的默认机制。在这种机制中,当调用方法时,将为每个值参数创建一个新的存储位置。实际参数的值将被复制到其中。因此,对方法内部的参数所做的更改不会对参数产生影响。以下示例演示了概念-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public void swap(int x, int y) {
             int temp;
             
             temp = x; /* save the value of x */
             x = y;    /* put y into x */
             y = temp; /* put temp into y */
          }
          static void Main(string[] args) {
             NumberManipulator n = new NumberManipulator();
             
             /* local variable definition */
             int a = 100;
             int b = 200;
             
             Console.WriteLine("Before swap, value of a : {0}", a);
             Console.WriteLine("Before swap, value of b : {0}", b);
             
             /* calling a function to swap the values */
             n.swap(a, b);
             
             Console.WriteLine("After swap, value of a : {0}", a);
             Console.WriteLine("After swap, value of b : {0}", b);
             
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Before swap, value of a :100
    Before swap, value of b :200
    After swap, value of a :100
    After swap, value of b :200
    
    它表明尽管值在函数内部已更改,但值没有更改。
    按引用传递
    引用参数是对变量的存储位置的引用。当您通过引用传递参数时,与值参数不同,不会为这些参数创建新的存储位置。参考参数表示与提供给该方法的实际参数相同的存储位置。
    您可以使用ref关键字声明参考参数。以下示例演示了这一点-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public void swap(ref int x, ref int y) {
             int temp;
    
             temp = x; /* save the value of x */
             x = y;    /* put y into x */
             y = temp; /* put temp into y */
          }
          static void Main(string[] args) {
             NumberManipulator n = new NumberManipulator();
             
             /* local variable definition */
             int a = 100;
             int b = 200;
    
             Console.WriteLine("Before swap, value of a : {0}", a);
             Console.WriteLine("Before swap, value of b : {0}", b);
    
             /* calling a function to swap the values */
             n.swap(ref a, ref b);
    
             Console.WriteLine("After swap, value of a : {0}", a);
             Console.WriteLine("After swap, value of b : {0}", b);
     
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Before swap, value of a : 100
    Before swap, value of b : 200
    After swap, value of a : 200
    After swap, value of b : 100
    
    它表明交换函数内部的值已更改,并且此更改反映在Main函数中。
    output 参数
    return语句只能用于从函数返回一个值。但是,使用输出参数,您可以从函数返回两个值。output 参数与参考参数相似,不同之处在于它们将数据从方法中传输出来而不是传输到方法中。
    以下示例说明了这一点-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public void getValue(out int x ) {
             int temp = 5;
             x = temp;
          }
          static void Main(string[] args) {
             NumberManipulator n = new NumberManipulator();
             
             /* local variable definition */
             int a = 100;
             
             Console.WriteLine("Before method call, value of a : {0}", a);
             
             /* calling a function to get the value */
             n.getValue(out a);
    
             Console.WriteLine("After method call, value of a : {0}", a);
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Before method call, value of a : 100
    After method call, value of a : 5
    
    为output 参数提供的变量无需分配值。当您需要通过参数从方法返回值而不给参数分配初始值时,输出参数特别有用。通过以下示例,了解这一点-
    
    using System;
    
    namespace CalculatorApplication {
       class NumberManipulator {
          public void getValues(out int x, out int y ) {
              Console.WriteLine("Enter the first value: ");
              x = Convert.ToInt32(Console.ReadLine());
              
              Console.WriteLine("Enter the second value: ");
              y = Convert.ToInt32(Console.ReadLine());
          }
          static void Main(string[] args) {
             NumberManipulator n = new NumberManipulator();
             
             /* local variable definition */
             int a , b;
             
             /* calling a function to get the values */
             n.getValues(out a, out b);
             
             Console.WriteLine("After method call, value of a : {0}", a);
             Console.WriteLine("After method call, value of b : {0}", b);
             Console.ReadLine();
          }
       }
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    Enter the first value:
    7       #这里为控制台命令行输入
    Enter the second value:
    8       #这里为控制台命令行输入
    After method call, value of a : 7
    After method call, value of b : 8
    
上一节:
下一节: