C#入门:委托的简单理解

C#入门:委托的简单理解

      我们习惯于把数据作为参数传递给方法,例如:int max(int a,int b)。而有时某个方法执行的操作并不是针对数据进行的,而是要对另一个方法进行操作。更麻烦的是,在编译时我们不知道第二个方法是什么,这个信息只能在运行时得到,所以需要把第二个方法作为参数传递给第一个方法。这样的概念(抑或是说处理方法)利用C/C++里面的函数指针就可以很清晰地解决。 记得当初学习《数据结构》的课程时,实现遍历顺序表Traversal()就采用了函数指针来实现遍历元素时对应可能出现的函数(即方法)。所以说:C/C++语言的强大之处就在于指针,没有学会指针说你会C/C++其实一点意义都不大。

     C#语言中的委托是寻址方法的.NET版本,换言之,就是在变相地使用指针。如何来理解委托呢?我们可以把委托理解成一些方法的模型。委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数。对于一些方法,他们的参数和返回值得数据类型都是相同,仅仅具备的区别在于方法名称存在差异,对于这样满足一定模型的方法,我们就用委托来体现。

     比如我们存在一段顺序表(暂且用数组来体现),现在我们要做的就是遍历这一段循序表。对于遍历,我们采取的操作手段是不同的,比如修改顺序表里的内容、查找顺序表里的特殊值、判断顺序表里的内容的合法性,抑或是仅仅简单的输出顺序表里的内容。

     现在举出一个实例,就是调用一个方法,采用不同的排序算法。


/**
 *@link http://blog.iliyang.cn
 *@date 2012/08/27 
 */
using System;

namespace Base
{
    class Program
    {
        /// <summary>
        /// 声明委托Sort|设定排序函数的模型
        /// </summary>
        /// <param name="array">欲排序的数组</param>
        delegate void Sort(Int32[] array);

        /// <summary>
        /// 应用函数入口:仅限测试
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //创建一个顺序表(即一个数组)
            Int32[] array = { 10, 13, 12, 23, 34, 5, 96, 7, 81, 9 };
            Console.WriteLine("排序前:");
            foreach (int value in array)
                Console.Write(value + " ");
            Console.WriteLine();
            //Dispose(array, BubbleSort);
            Dispose(array, SelectSort);
            foreach (int value in array)
                Console.Write(value + " ");
            Console.WriteLine();
            Console.ReadKey(true);
        }

        /// <summary>
        /// 交换两个变量的值
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        static void Swap(ref Int32 a, ref Int32 b)
        {
            Int32 temp = a;
            a = b;
            b = temp;
        }

        /// <summary>
        /// 冒泡法排序
        /// </summary>
        /// <param name="array"></param>
        static void BubbleSort(Int32[] array)
        {
            for (int i = array.Length - 1; i > 0; --i)
            {
                for (int j = 0; j < i; ++j)
                {
                    if (array[j] > array[j + 1])
                    {
                        Swap(ref array[j], ref array[j + 1]);
                    }
                }
            }
        }

        /// <summary>
        /// 选择排序
        /// </summary>
        /// <param name="array"></param>
        static void SelectSort(Int32[] array)
        {
            for (int i = 0; i < array.Length; ++i)
            {
                int min = i;
                for (int j = i + 1; j < array.Length; ++j)
                {
                    if (array[j] < array[min])
                    {
                        min = j;
                    }
                }
                if (i != min)
                {
                    Swap(ref array[min], ref array[i]);
                }
            }
        }
        /// <summary>
        /// 调用委托[变量]
        /// </summary>
        /// <param name="array"></param>
        /// <param name="sort">排序的类型</param>
        static void Dispose(Int32[] array, Sort sort)
        {
            sort(array);
        }
    }
}

     理解这段代码,我想对C#的委托概念应该会有个大概的理解了。但委托的真正应用在于事件事件——[—般是通知代码发生了什么事件]。GUI编程主要处理事件。在引发事件时,运行库需要知道应执行哪个方法。这就需要把处理事件的方法作为一个参数传递给委托的。

本文系个人总结,转载时请保留博客地址:http://blog.iliyang.cn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值