新手提问,为什么要用委托,具体在什么时候会用?

zylsky 2014-04-10 10:32:41
高手勿笑.

    class Program
{
delegate int mydelegate(int x, int y);

static int Add(int x,int y)
{
return x+y;
}
static void Main(string[] args)
{
mydelegate add = new mydelegate(Add);
add.Invoke(5, 6);

}
}

为什么不直接用Add方法?委托什么时候用呢?
...全文
658 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2014-04-10
  • 打赏
  • 举报
回复
打个比方,大家买东西都是去超市吧,这就好比委托,而去工厂买就是直接调用,各有各的好处,这个看多了就懂了。
md5e 2014-04-10
  • 打赏
  • 举报
回复
用控件的事件来理解就通了
zylsky 2014-04-10
  • 打赏
  • 举报
回复
引用 3 楼 Q1092926267 的回复:
你那个用委托没必要, 给你举个例子吧 你有一个线程用于循环处理数据后绑定gridview的值 直接绑定肯定不行 这个时候就需要用委托绑定了
原来是这样啊,
six-years 2014-04-10
  • 打赏
  • 举报
回复
你那个用委托没必要, 给你举个例子吧 你有一个线程用于循环处理数据后绑定gridview的值 直接绑定肯定不行 这个时候就需要用委托绑定了
showjim 2014-04-10
  • 打赏
  • 举报
回复
委托用于抽象,当你需要一个约定的调用而不能自己实现的时候
six-years 2014-04-10
  • 打赏
  • 举报
回复
一般在线程里面更新UI的时候需要用委托哦
snowyatou 2014-04-10
  • 打赏
  • 举报
回复
教材书上委托都是LZ写的那些,感觉有点吭,看了都不太明白, 还是贴吧里的回复好用
zylsky 2014-04-10
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
因为程序可能是多个人合作编写的。 编写程序并且让另一个人调用的程序员我们管它叫资深程序员 编写特定功能面向用户,并且调用资深程序员为他提供的控件和类库的人我们叫他菜鸟程序员。 只有前一种人才需要使用委托,后一种人的确不需要。 委托可以做一件事情,就是编写一套代码,在菜鸟程序员不修改他代码的情况下,预留一些地方让菜鸟程序员“填空”。 委托是一种特殊的变量类型,它可以将待插入的代码视为变量传递给一个方法。
就是想从菜鸟升级.
threenewbee 2014-04-10
  • 打赏
  • 举报
回复
因为程序可能是多个人合作编写的。 编写程序并且让另一个人调用的程序员我们管它叫资深程序员 编写特定功能面向用户,并且调用资深程序员为他提供的控件和类库的人我们叫他菜鸟程序员。 只有前一种人才需要使用委托,后一种人的确不需要。 委托可以做一件事情,就是编写一套代码,在菜鸟程序员不修改他代码的情况下,预留一些地方让菜鸟程序员“填空”。 委托是一种特殊的变量类型,它可以将待插入的代码视为变量传递给一个方法。
322829 2014-04-10
  • 打赏
  • 举报
回复
关注,学习中
David_Fighting 2014-04-10
  • 打赏
  • 举报
回复
俺理解,delegate主要是对外,内部用就是多个线程(也算是对外);
ycg_893 2014-04-10
  • 打赏
  • 举报
回复
(

class Program
    {
        delegate int mydelegate(int x, int y);
 
       static int Add(int x,int y)
        {
            return x+y;
        }
       private static void Call(int a, int b, Func<int, int, int> fun)
        {
            int value = fun(a, b);
            Console.WriteLine(value);
          }

        static void Main(string[] args)
        {
           Call(2, 2, (a, b) =>
            {
                return a * b;
            });

           Call(1,3,Add);
        }
    }

ycg_893 2014-04-10
  • 打赏
  • 举报
回复
不要把委托和线程混在一起,只是多线程操作UI时,需要用到委托来解决,而委托能解决的问题远不止这个。如Linq用是就是各种委托。 如果要解释多线程更新UI个人认为可以这样理解:多个线程不能同时更新UI就如同两个人不能同时相向面行地走直钢丝绳,因这样两个都会掉下去,因此我们就把如何走钢丝绳的方式(委托)告诉每一个人,当确定不会出现两个人同时相向而行时(系统线程调度到创建UI的线程时),就按照预先给的方式(委托)走下去就行了。 委托在.Net的应用非常多,如Linq,你的例子比较单调,因此不知道他有什么用。 如:你有一个方法,会给出两个参数,并返回一个整数值(像你的例子),但不明确这两个参数要如何运算的,什么都有可能,不可能预先确定的。这个时用委托就会比较简单,当然也可以其他办法如接口;

   private void Call(int a, int b, Func<int, int, int> fun)
        {
            int value = fun(a, b);

            if (value > 1000)
            {
                //Save1
            }
            else
            {
                //Save2
            }
        }

   private void test()
        {
            this.Call(1, 2, (a, b) =>
            {
                return a + b;
            });

            this.Call(1, 2, (a, b) =>
            {
                return a - b;
            });

            this.Call(1, 2, (a, b) =>
            {
                return a * b;
            });

            this.Call(1, 2, (a, b) =>
            {
                return a / b;
            });

            this.Call(1, 2, (a, b) =>
            {
                return a + b - 1;
            });
        }
笛声风中飘 2014-04-10
  • 打赏
  • 举报
回复 1
从数据结构来说,委托里是函数的入口地址。从设计来说,委托是对功能性的一个约定。用写一个排序函数来说,if(a>b)这句就是具体的调用,而一个a和b不是一个直接可以比较的数值或字符,你的函数就会失效.但在这里,if(a>b)这句从功能型来说,就是传入a和b,a>b你就给我返回true,这就是你所需要的,具体怎么比你不需要知道.因此你把它抽象为一个Func<objct,object,bool> compare(参数为两个object,返回值为bool)的委托,同时在排序中改为if(compare(a,b))。如此一来,你这个函数里的比较方式面对的就是比较器的抽象,面对任何数据类型,你都不需要改动源码.用生活来说,楼主你是老板,要买一杯咖啡,你的需要就是有一杯咖啡递到你面前,让你能喝,至于这杯咖啡是人还是鬼,是怎么弄来的,你都不要关心。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧