zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#学习记录——Main()函数 、委托

c#学习 函数 记录 main 委托
2023-09-11 14:14:49 时间

『黎明之前总有一段时间特别黑。』—— 网络
时间的黎明躺着也能迎来,但人生的黎明,需要我们努力拼搏才能抵达,加油!

Main()函数

Main()是C#应用程序的入口点,执行这个函数就是执行应用程序。也就是说,在执行过程开始时,会执行Main()函数,在Main()函数执行完毕时,执行过程就结束了。

这个函数可以返回void或int,有一个可选参数string[]args。Main()函数可使用如下4种版本:

static void Main()
static void Main(string[]args)
static int Main()
static int Main(string[]args)

上面第3和第4个版本返回一个int值,它们可以用于表示应用程序的终止方式,通常用作一种错误提示(但这不是强制的)。一般情况下,返回0反映了“正常”的终止(即应用程序已经执行完毕,并安全地终止)。

Main()的可选参数args是从应用程序的外部接受信息的方法,这些信息在运行应用程序时以命名行参数的形式指定。

要执行控制台应用程序时,指定的任何命令行参数都放在这个args数组中,接着可以根据需要在应用程序中使用这些参数。

委托

委托(delegate)是一种存储函数引用的类型。
委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表。

定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有返回类型和参数列表的函数引用。之后就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

有了引用函数的变量后,就可以执行无法用其他方式完成的操作。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前不必知道调用的是哪个函数。
下面的示例使用委托访问两个函数中的一个:
1、示例:
(1)、把下列代码添加到Program.cs中:

using System;

namespace L024_ConsoleApp1
{
    class Program
    {
        delegate double ProcessDelegate(double param1, double param2);
        static double Multiply(double param1, double param2) => param1 * param2;
        static double Divide(double param1, double param2) => param1 / param2;
        static void Main(string[] args)
        {
            ProcessDelegate process;
            Console.WriteLine("Enter 2 numbers separated with a comma:");
            string input = Console.ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = Convert.ToDouble(input.Substring(0, commaPos));
            double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
            Console.WriteLine("Enter M to multiply or D to divide:");
            input = Console.ReadLine();
            if (input == "M")
                process = new ProcessDelegate(Multiply);
            else
                process = new ProcessDelegate(Divide);
            Console.WriteLine($"Result:{process(param1, param2)}");
            Console.ReadKey();
        }
    }
}

(2)、执行代码,在看到提示输入值,结果如下图:
在这里插入图片描述
2、示例说明:
这段代码定义了一个委托ProcessDelegate,其返回类型和参数与函数Multiply()和Divide()相匹配。注意Multiply()和Divide()方法使用了C#6引入的=>(Lambda箭头)。

static double Multiply(double param1, double param2) => param1 * param2;

委托的定义如下所示:

delegate double ProcessDelegate(double param1, double param2);

delegate关键字指定该定义是用于委托的,而不是用于函数的(该定义所在的位置与函数定义相同)。接着,该定义指定double返回类型和两个double参数。实际使用的名称可以是任意的,所以可以给委托类型和参数指定任意名称。这里委托名是ProcessDelegate,double参数名是param1和param2。

Main()中的代码首先使用新的委托类型声明一个变量:

static void Main(string[] args)
        {
            ProcessDelegate process;
        }

接着用一些比较标准的C#代码请求由逗号分隔的两个数字,并将这些数字放在两个double变量中:

Console.WriteLine("Enter 2 numbers separated with a comma:");
            string input = Console.ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = Convert.ToDouble(input.Substring(0, commaPos));
            double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));

注意: 为说明问题,这里没有验证用户输入有效性。如果这些是“现实中的”代码,就应花费更多时间来确保在局部变量param1和param2中得到有效的值。

接着询问用户,这两个数字是要相乘还是相除:

Console.WriteLine("Enter M to multiply or D to divide:");
            input = Console.ReadLine();

根据用户的选择,初始化process委托变量:

if (input == "M")
                process = new ProcessDelegate(Multiply);
            else
                process = new ProcessDelegate(Divide);

要把一个函数引用赋给委托变量,需要使用略显古怪的语法。这个过程比较类似于给数组赋值,必须使用new关键字创建一个新委托,提供一个引用所需函数的参数,这里也就是Multiply()或Divide()函数。注意这个参数与委托类型或目标函数的参数不匹配,这是委托赋值的一种独特语法,参数是要使用的函数名且不带括号。
实际上,这里可以使用略微简单的语法:

if (input == "M")
                process = Multiply;
            else
                process = Divide;

编译器会发现,process变量的委托类型匹配两个函数的签名,于是自动初始化一个委托。可以自行确定使用哪种语法,但是一些人喜欢使用较长的版本,因为它更容易一眼看出会发生什么。

最后,使用该委托调用所选的函数。无论委托引用的是什么函数,该语法都是有效的:

Console.WriteLine($"Result:{process(param1, param2)}");
            Console.ReadKey();
        }

这里把委托变量看成一个函数名。但与函数不同,我们还可以对这个变量执行更多操作,例如,通过参数将其传递给一个函数,如下列所示:

static void ExecuteFunction(ProcessDelegate process)=>process(2.2,3.3);

就像选择一个要使用的“插件”一样,通过把函数委托传递给函数,就可以控制函数的执行。例如,一个函数要对字符串数组按照字母进行排序。对列表排序有几个不同的方法,它们的性能取决于要排序的列表特性。使用委托可以把一个排序算法函数委托传递给排序函数,指定要使用的函数。
在这里插入图片描述