搞不明白用委托有什么好处
下面这个程序,我照书上打的,我看这程序不用委托也能实现啊,真不明白用委托有什么好处,我到是觉得用委托反而罗嗦了.请问各位大侠用委托到底有啥好处啊?(只有40分了,sorry)
using System;
using System.Collections.Generic;
using System.Text;
namespace _CSharp_Console
{
class Employee
{
private string name;
private decimal salary;
public Employee(string name, decimal salary)
{
this.name = name;
this.salary = salary;
}
public override string ToString()
{
return string.Format(name + ",{0:C}", salary);
}
public static bool CompareSalary(object o, object o2)
{
Employee e = (Employee)o;
Employee e2 = (Employee)o2;
return (e.salary > e2.salary) ? true : false;
}
}
class Program
{
delegate bool dCompare(object o, object o2);
static void Sort(object[] sortArray, dCompare dMethod)
{
for (int i = 0; i < sortArray.Length; i++)
{
for (int j = i + 1; j < sortArray.Length; j++)
{
if (dMethod(sortArray[i], sortArray[j]))
{
object temp = sortArray[i];
sortArray[i] = sortArray[j];
sortArray[j] = temp;
}
}
}
}
static void Main(string[] args)
{
Employee[] emp =
{
new Employee("Peter",100),
new Employee("Mary",2345),
new Employee("Jack",1539),
new Employee("Tom",5500),
new Employee("Kevin",(decimal)99.23),
new Employee("Jim",3420)
};
dCompare dcom = new dCompare(Employee.CompareSalary);
Program.Sort(emp, dcom);
for (int i = 0; i < emp.Length; i++)
{
Console.WriteLine(emp[i].ToString());
}
Console.ReadLine();
}
}
}
--------------------编程问答-------------------- 这样给你说 你可以定义一个函数
参数是一个函数
但是这个参数是别人传进来的
是给别人用的时候
你并不知道你需要传入的函数的名称
那么定义一个函数委托
就可以解决这个问题
委托 实际上 就是一个 函数 格式的 映射。(c++里面叫 函数指针 类似) --------------------编程问答-------------------- 根据微软的说法是
经过包装的指针,,安全,高效。 --------------------编程问答-------------------- ......没明白 --------------------编程问答-------------------- 呵呵,委托是给别人用的
自己写程序用不到 --------------------编程问答-------------------- .NET中的事件基本上是代理/委托实现的,如
this.Load += new System.EventHandler(this.Form1_Load); --------------------编程问答-------------------- 也就是说你提供一个调用,但具体调用什么方法,由调用方提供
你就可以用一个委托,用调用方在调用时传入实际的方法~ --------------------编程问答-------------------- 更适用于Framework相对于Application --------------------编程问答-------------------- 好处多多 可以降低耦合性 --------------------编程问答-------------------- 但是我经验上使用委托总会有些很难预料的流程错误... --------------------编程问答-------------------- 我理解的意思:
我们写程序的时候只给出委托的定义(签名),到底委托和哪个方法绑定(也就是传入哪个方法)我们不管,这留给调用委托的人去干.
请问是这个意思吗? --------------------编程问答-------------------- 小程序确实体会不到委托的好处,反而会使程序变得很别扭,但是当程序到达一定复杂程度后,就能体现出来了,以后lz会体会到的。
不过在有些地方是必须使用委托的,比如线程间操作UI控件,异步的回调函数等等。
--------------------编程问答-------------------- C#里没有指针(不考虑unsafe),delegate就相当于函数指针。有些地方你可能不得不用函数指针的时候,就可以使用delegate。如在C#里调用API函数createthread时就需要函数指针,就需要用到delegate --------------------编程问答-------------------- 感觉类似于第三方作为中间人为两个对象交互,而两个对象里面不需要包含对方 --------------------编程问答-------------------- 我是一个魔法瓶,只要有东西和我取得联系,我就会把要做的给那东西,按造那东西提供的要求给,不管这个东西是人是鬼还是小狗小猫。
首先需要给我建立个联系(建立各委托),告诉我正确的魔咒(委托给我的要求,一个函数)我会给你施加魔法的权利,然后,你通知我让我做也行,我自己高兴了给你做也行,总之是按照你的要求做的,我不关心到底有多少东西让我做,只要我做就把所有和我建立联系的东西都做一遍。
不对的请指教
另:他比函数指针灵活多了 --------------------编程问答-------------------- 委托是触发式的.比如在错误处理中,你当然可以用try..catch来处理,但并不能保证捕获所有的错误.你也不知道错误什么时候发生,所以你可以用委托来处理.
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.Error += new System.EventHandler(this.ZTCPage_Error);
}
protected void ZTCPage_Error(object sender, System.EventArgs e)
{
string errMsg;
Exception currentError = Server.GetLastError();
errMsg = "<link rel=\"stylesheet\" href=\"../Css/ZTC.CSS\">";
errMsg += "<h1>Page Error</h1><hr/>An unexpected error has occurred on this page. The system " +
"administrators have been notified. Please feel free to contact us with the information " +
"surrounding this error.<br/>"+
"The error occurred in: "+Request.Url.ToString()+"<br/>"+
"Error Message: <font class=\"ErrorMessage\">"+ currentError.Message.ToString() + "</font><hr/>"+
"<b>Stack Trace:</b><br/>"+
currentError.ToString();
errMsg += "<br><hr/><br><input type='button' value='返回前一页' onclick='history.back(-1);'>";
WriteErrorToText(Request.Url.ToString(),currentError.Message.ToString(),currentError.ToString());
Response.Write( errMsg );
Server.ClearError();
} --------------------编程问答-------------------- 没有委托 就没有安全指针用
没有委托 就没有事件用
没有委托 就没有回调用
没有委托 也没有异步调用
没有委托 就没有多个进程
没有委托 就没有windows form
没有委托 那么你也不用学习.net 了
那么你说委托 有什么用 --------------------编程问答-------------------- ? --------------------编程问答-------------------- 函数指针 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 用久了你会发现他的好处 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 没有委托 就没有安全指针用
没有委托 就没有事件用
没有委托 就没有回调用
没有委托 也没有异步调用
没有委托 就没有多个进程
没有委托 就没有windows form
没有委托 那么你也不用学习.net 了
那么你说委托 有什么用
___________________________________
说得好! --------------------编程问答-------------------- //没有委托 就没有多个进程
纠正一下
没有委托 就没有多个线程
线程要运行的函数,要用委托来包装的~ --------------------编程问答-------------------- 即使你没有写过委托,但你可能不知不觉中已经大量使用现有的委托了~ --------------------编程问答-------------------- 没有委托 就没有安全指针用
没有委托 就没有事件用
没有委托 就没有回调用
没有委托 也没有异步调用
没有委托 就没有多个进程
没有委托 就没有windows form
没有委托 那么你也不用学习.net 了
那么你说委托 有什么用
----------------------------
说得好,呵呵 --------------------编程问答-------------------- up --------------------编程问答-------------------- http://www.cppblog.com/zhuweisky/archive/2005/09/11/193.aspx
看看c++里事件机制的实现。看的懂的话。你就知道为什么要用委托了。就是为了实现事件机制。然后发现委托这东西他们做的狠安全,干脆就取消了函数指针取而代之。美其名曰:安全。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 虽然了解不深,但觉得,委托除了能加强封装性外,其最大的用处还是自定义事件那一块.
--------------------编程问答-------------------- 就像现在,如果你要去买房子或者去租房子,你会挨家去敲门问人家房子卖吗?出租吗??
你肯定不会,你会去到房屋租赁那去.
房屋租赁就相当是个委托!
明白了吗?? --------------------编程问答-------------------- 这个例子不是C#高级编程里的例子吗?这章的最后介绍了委托的好处呀。
在这个例子中,只要告诉Sort数组和比较的函数(委托,函数指针)Sort只管算法。就可以完成任务了。而不用管类型。
--------------------编程问答-------------------- 使用委托的目的就是在运行中向参数传递方法,并由委托对象生成的实例接收这个参数方法的返回值,因此,在声明委托型的对象时应根据类中的方法结构来定义,或者说在引用类中应当根据委托型对象的结构来生成响应事件的方法结构,比如两者都有哪些类型的参数、返回值的类型,也就是说两者要保持一致。 --------------------编程问答-------------------- 自己也正在搞委托,也是和lz一样的困惑,写了个委托的例子,发现不用委托用对象引用函数的办法一样实现,而且还蛮啰嗦的,看了各位高手的回帖,基本清楚了。自己再写些代码估计就搞定了。谢谢楼主提这么好的问题。 --------------------编程问答-------------------- 好多星星,啥时候我也能混到星星呀!!! --------------------编程问答-------------------- C++里的指针很烦人,委托就行了,呵呵 --------------------编程问答-------------------- C# winform 开发群,群号:57718204,我们期待您的加入!! --------------------编程问答-------------------- 不明白委托,就去看面向函数的高阶函数,看明白了,就能理解委托了 --------------------编程问答-------------------- 委托就像放易做图一样,你可以关上窗户自己一个人享用,也可以利用事件发出去臭别人,可以臭很多人。楼主的例子就是自己享用的典型。
--------------------编程问答-------------------- ls的经典 --------------------编程问答-------------------- --------------------编程问答-------------------- 高人,呵呵……
我一般只把委托用到线程和自定义控件事件。 --------------------编程问答-------------------- C++里的函数指针,只不过更安全一点 --------------------编程问答-------------------- 函数指针,有的时候不同的情况处理方法不同的时候很有用。
特别是定义控件,需要执行一个例如数据绑定。
但是绑定方法通过委托传过来。 --------------------编程问答-------------------- 接口 ---》类的抽象
委托----》方法的抽象 --------------------编程问答-------------------- 其实等于c里面的函数指针` --------------------编程问答-------------------- 44楼说得还可可以; --------------------编程问答-------------------- 没一个明白的,真正明白的应该应该从计算机的基础用大白话把别人说明白,这些都用些专业术语的都是子感觉明白了。 --------------------编程问答-------------------- 楼主的这个例子很不好,该例中确没有充分必要使用委托,纯属吃饱撑的。委托很重要,但滥用委托会严重影响代码的可阅读性。
--------------------编程问答-------------------- 委托其实就是将自己不知道或不擅长处理的业务逻辑,交给知道如何或擅长处理该业务逻辑的对象去处理,而对象自身只处理自己擅长的逻辑。 --------------------编程问答-------------------- 伱就把委托当成接口不好了,但他比接口更好使 --------------------编程问答--------------------
同感,看了这么多还是没有看懂。我现在没有理解,要是我理解了什么是委托一定不会这样解释,楼上所有解释等于没有解释。 --------------------编程问答-------------------- 07年的贴都没结,CSDN管理员效率怎么这么低的? --------------------编程问答-------------------- 这里高手好多呀 --------------------编程问答-------------------- 使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。 --------------------编程问答-------------------- 我就说一件事,不用委托,你给我写个控件.你试试. --------------------编程问答--------------------
说得太对了!
--------------------编程问答-------------------- 委托!!!这个 主要翻译的太拗口了,以至于我们总是通过际面意思来推断其内涵!!
还有其它翻译:像签名(这个比较不错,自认为),代理(……),函数指针……等 等!!
他的作用就就跟接口一个作用!!只是接口是在类的基础上抽象出来的,而这个代理嘛,是在函数的基础上抽象出来的!!
只是一种人的思想用计算机语言表达出来的意思而已!!! --------------------编程问答-------------------- 以后你就知道 那是相当有用 --------------------编程问答-------------------- 委托是用来实现自动化处理的…… --------------------编程问答-------------------- 用处大家都说了:我就不重复了。
我就说说它的定义吧:---(事先声明,本人的理解,不从书出,观点不同,请发言)
委托:
是自定义类型(常见的自定义类型有结构体,类),但这个自定义类型是一个函数的类型(如何区分呢?就是参数和返回值),
说明白一点就是 用这个类型 来声明的变量,这个变量可以=函数名;
当我们运行这个变量时,就是运行这个函数名的函数。
记住,委托 不是那个变量,而是那个变量的类型。
--------------------编程问答-------------------- 顺便跟你说一说事件吧。
事件:
以委托 为类型,所实例化的对象(当然这个对象是用event 修饰过的),
用event 的作用是,把所实例化的对象,变成对象集,而不是单一的对象,
比如:
下面声明一个事件:
public event 委托名 事件名;
与下面 实例化 委托 对象是一样的,
public List<委托名> 对象名;
其实:
事件名
//就与
对象名
//是一样的,只是用法不同,
所以说, 事件,就是于 [委托集合] 为类型 所实例化的[对象]。
--------------------编程问答-------------------- 我一直到工作以后才开始接触委托这些东西。上学的时候,学校里用Java,还接触不到这个概念,那时候对异步编程也是模模糊糊的感觉。楼主何必这么急着了解这些,慢慢来,早晚就知道了 --------------------编程问答-------------------- 会有明白的一天的呵呵 --------------------编程问答-------------------- 我做的一个控件,其中一个按钮的方法,需要调用控件的人决定方法。
我定义一个委托就行,用空间的人自己实现这个委托。 --------------------编程问答-------------------- 其实我也没有搞明白委托是用来干什么的。 --------------------编程问答-------------------- 哈哈,这个问题从2007一直问到2012,
几乎每个学.net的都要这么一问 --------------------编程问答-------------------- 这么多挖坟的。。。。话说,这帖是不是也该结了。。 --------------------编程问答--------------------
你看看。net中的事件就知道委托到底有多强大呢 --------------------编程问答-------------------- 事件就是一种委托,vs开发的时候并不知道某事件触发时调用什么方法,什么方法名称,这时候委托就产生作用了,Button.click+=new System.EventHandler(this.Button_Clicked);
这样,当事件触发时,系统直接调用的是Button.Click,相当于调用了Button_Clicked方法。
另外委托还用其他多种应用,也不一一说明了,如:异步调用等。 --------------------编程问答-------------------- 学习。 --------------------编程问答-------------------- 關注. --------------------编程问答-------------------- 委托可实现松耦合设计,而且有时候一些处理过程并不会在本类内处理,处理方式因情况而异。这事就需要委托或事件来实现。 --------------------编程问答--------------------
+1 不错! --------------------编程问答--------------------
+1 --------------------编程问答--------------------
++1 线程间操作UI控件 这个深有体会!!! --------------------编程问答-------------------- 总结了上面的跟自己的理解(不完全正确)
C#中的委托可以说是对C/C++中的函数指针的一种安全封装,而且它是C#中的五大类型之一(类类型,枚举,数组,结构,委托),因此它是面向对象的。委托是一种对方法的间接调用,在简单的程序例子中使用过多的委托,显示不出它的好处,相反还会影响程序的可读性,还不如直接用方法的直接调用代替。但如果在复杂的程序中,委托就显示出了它的优势,这个时间我们更多的不是关注它的安全性了(因为它是函数的一种签名,硬性规定了方法的参数类型,个数,顺序),而是关注它的自动化处理。
委托可以分为两步,第一步是定义委托,它的定义跟类的定义是有区别的,主要区别在于没有实体。第二步是生成委托实例,这时候与类的区别在于,在生成的时候必需要传入一个方法名做为参数。如果用event去修饰委托实例,实际上是在定义一个委托集(List<EventHandler> event).
委托在用户自定义控件方面也发挥了很大的作用,用户自定义控件无法确定用户的操作,因此我们需要在运行时去得到用户的操作,然后在业务逻辑上去实现不同的方法调用,这个时候就可以通过委托来实现。在委托的实例化推迟到运行时(有点像反映),由用户的操作去动态生成委托实例,从而实现不同方法代码块的执行。 --------------------编程问答-------------------- 一般基于事件驱动的行为,在C#中几乎全是用委托,然后用委托定义事件,
我看那么多人多解释,我就不解释了。。。总之用C#的人刚学delegate和event是个坎,一旦通了就更上一层楼~
不过我提醒lz千万别把委托和if...else弄在一起。
别来个什么
if(...)
handler+=fun1;
else
handler+=fun2;
如果有大量的判定,还不如用函数反射呢~ --------------------编程问答-------------------- 刚发现有人挖坟。 --------------------编程问答-------------------- 委托是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。
通俗的说,委托是这样一种类型:这种类型的实例,指向其它类型的方法。
委托主要就是提供间接调用、构建双向系统用的,他为消息模型和多线编程提供了基础。 --------------------编程问答--------------------
对委托的这几大作用不是很理解,但是委托对C#来说确实很关键的一个特性 --------------------编程问答-------------------- ++ --------------------编程问答--------------------
+++ --------------------编程问答-------------------- 在WINFORM程序中,如果是多线程的话一般都需要用到委托 --------------------编程问答-------------------- lz是初学.说太复杂的估计lz听得也是天花乱坠.
这么说吧.当我易做图着用java不得不写一堆一堆的匿名类的时候.
我心里想的就是sun这个易做图当初为毛不在java里弄个委托啥的. --------------------编程问答-------------------- 哪位又把07年的帖子挖出来了?
补充:.NET技术 , C#