`

C#入门经典之delegate关键字

阅读更多

        委托(delegate)是一种可以把引用存储为函数的类型。这听起来相当棘手,但其机制是非常简单的。委托最重要的用途在本书后面介绍到事件和事件处理时才能解释清楚,但这里也将介绍有关委托的许多内容。委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表。

        在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回

类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一

样。

        有了引用函数的变量后,还可以执行不能用其他方式完成的操作。例如,可以把委托变量作为

参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需

知道调用的是哪个函数。下面的示例使用委托访问两个函数中的一个。

 class Program
    {
        delegate double ProcessDelegate(double param1, double param2);
        static double Multiply(double param1, double param2)
        {
            return param1 * param2;
        }
        static double Divide(double param1, double param2)
        {
            return 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: {0}", process(param1, param2));
            Console.ReadKey();
        } 
    }

 执行代码,结果如下:


 

示例的说明 

 这段代码定义了一个委托ProcessDelegate,其返回类型和参数与函数Multiply()和Divide()相匹配。委托的定义如下所示:

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

 

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

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: {0}", process(param1, param2)); 
Console.ReadKey(); 
} 

 

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

static void ExecuteFunction(ProcessDelegate process) 
{ 
process(2.2, 3.3); 
} 

 

就像选择一个要使用的“插件”一样,把它们传递给函数委托,就可以控制函数的执行。例如,一个函数要对字符串数组按照字母进行排序。对列表排序有几个不同的方法,它们的性能取决于要排序的列表特性。使用委托可以把一个排序算法函数委托传递给排序函数,指定要使用的方法。委托有许多用途,但如前所述,它们的大多数常见用途主要与事件处理有关

 

  • 大小: 10.3 KB
分享到:
评论

相关推荐

    C#入门经典 及代码

    "C#入门经典及代码"这套资料旨在帮助初学者掌握C#的基础知识,并通过实际的代码示例加深理解。 首先,学习C#,你需要了解它的基本语法结构。C#中的程序始于`using`语句,它用于引入命名空间,例如`System`,这包含...

    C#入门经典 附录程序

    《C#入门经典》是一本面向初学者的编程教材,旨在帮助新手快速掌握C#语言的基础知识和编程技巧。在附录程序中,通常包含了书中各个章节实例代码,供学习者实践和调试,以加深对理论知识的理解。下面将详细阐述C#语言...

    C#入门经典章节后答案

    《C#入门经典》是许多初学者学习C#编程语言的首选教材,其第三版更是深受读者喜爱。这本书深入浅出地介绍了C#的基础知识、语法特性以及编程实践,通过丰富的习题帮助读者巩固所学。现在我们来详细探讨一下其中可能...

    c#入门经典(包括阅读器)

    《C#入门经典》是一本由Karli Wason和Marco Bellinaso合作撰写,并由康博译成中文的编程入门教程。这本书旨在帮助初学者掌握C#编程语言的基础知识,从而能够开发出自己的应用程序。PDGreader可能是书中推荐或附带的...

    C#入门经典第六版pdf和工程代码

    《C#入门经典第六版》是一本深受编程初学者欢迎的教材,主要针对C#语言的基础知识和实际应用进行深入浅出的讲解。这本书涵盖了从基础语法到高级特性的全面内容,旨在帮助读者快速掌握C#编程技能。通过阅读PDF文档和...

    C#入门经典2

    《C#入门经典2》是针对初学者设计的一本教程,涵盖了C#编程语言的基础到进阶知识。根据描述中的“第350-700页”,我们可以推测这部分内容可能涉及C#的中级概念和高级特性。接下来,我们将深入探讨这些页面中可能出现...

    c#入门经典第五版书后习题源代码

    《C# 入门经典第五版》是一本深受初学者喜爱的编程教材,它系统地介绍了C#语言的基础知识和编程技巧。书后的习题源代码是学习过程中的重要参考资料,帮助读者通过实践来巩固理论知识,提升编程技能。这份压缩包包含...

    C# 入门至进阶 C# 入门至进阶

    C#拥有一套完整的关键字集,包括但不限于`abstract`, `as`, `base`, `bool`, `break`, `byte`, `case`, `catch`, `char`, `checked`, `class`, `const`, `continue`, `decimal`, `default`, `delegate`, `do`, `...

    C#入门经典 第4版 源码part4 第23章 程序2

    《C#入门经典 第4版》是一本针对初学者深入浅出介绍C#编程语言的书籍,第四版特别关注Microsoft Visual C# 2008这一版本。在本书的第23章,作者可能详细讲解了如何利用C#进行事件处理和注册,这在构建交互式应用程序...

    C#入门资料

    本套“C#入门资料”是针对初学者设计的,特别适合那些希望踏入编程世界的新人。中文第三版PDF文件涵盖了C#的基础概念和核心语法,将帮助读者快速掌握C#的基本知识和编程技巧。 首先,资料会介绍C#的基础语法,包括...

    c#入门经典

    《C#入门经典》是一本面向初学者的编程教材,主要涵盖了C#语言的基础知识、核心概念以及实际应用。在学习C#的过程中,了解并掌握这些知识点是至关重要的。 首先,C#是一种由微软公司推出的面向对象的编程语言,它是...

    C#.net入门学习教程1

    C#与C++和Java有诸多相似之处,但也有其独特的特点。例如,C#引入了命名空间(Namespace)来管理类库,使得代码组织更加清晰。你将学习如何使用using语句导入所需的命名空间。 接下来,你将接触C#的数据类型。C#...

    C#入门相关代码:delegateTest

    本压缩包“C#入门相关代码:delegateTest”提供了一些关于C#中委托(Delegate)的实践示例,这对于初学者理解这一关键概念至关重要。 首先,我们需要了解什么是C#中的委托。委托在C#中可以看作是事件处理程序的类型...

    C#——wpf入门经典

    C#入门经典:学习笔记 面向对象编程 C#是一种面向对象的语言,具有封装、继承、多态等特性。所有的类型可以看作是一个对象,C#只允许单继承,即一个类不会有多个基类。 .NET 框架 .NET 框架包括四个部分:类型...

    C#基础应用实例

    委托的定义使用`delegate`关键字,它定义了一个或多个方法的签名。例如,我们可以定义一个名为`EventHandler`的委托,用于处理事件。 最后,**事件(Event)**是C#中的一种特殊类型的委托,主要用于实现发布-订阅...

    C#入门编程&VS2015; 第13章代码

    在本资源中,我们主要关注的是"C#入门编程"与"Visual Studio 2015"的结合,特别是在第13章的学习内容。C#是一种由微软开发的强大且灵活的面向对象的编程语言,广泛应用于Windows平台上的软件开发,尤其是.NET框架下...

    C#初级入门2010

    10. **异步编程**:C#引入了async和await关键字,使得编写异步代码更加简洁,避免了复杂的回调函数。 11. **自动垃圾回收(Garbage Collection)**:C#的内存管理由垃圾回收器自动进行,程序员无需手动释放内存,...

Global site tag (gtag.js) - Google Analytics