学C#感觉有些概念上的东西还是必须要明确,才能更好的掌握其核心构架.其中委托技术是C#中新的概念.也值得大家好好注意.
委托的概念是将引用存储为函数, 在此肯定先要理解什么是引用[不谈]. 它的机制事实上是比较简单的. 但如何用好委托却并非一件完全简单的事情. 以下是对委托的一些个人看法.
首先委托要用关键字delegate ,在用委托之前要先生成一个委托对象,再将此对象与其能够匹配的函数相联系起来,就起到通过委托来实现函数调用的目的.
事实上委托的功能远不止如此, 在事件驱动的原理中它就相当重要, 也体现出了.NET技术的相关核心功能模式.
大家都知道在静态函数中是不能直接调用非静态函数, 这也是因为在静态函数中不能把函数的指针作参数传递.
下面给个极为简单的例子来说明我对委托的理解:
namespace Console_interface1
{
class Program
{
delegate int delegate_pro(int p1,int p2);
private static int funcA(int para1, int para2)
{
return para1 * para2;
}
private static int funcB(int para1, string para2)
{
return para1*2;
}
private int funcC(int a)
{
int c = funcA(funcD(2), 22);
return a * c;
}
private int funcD(int a)
{
return a * 2;
}
static void Main(string[] args)
{
delegate_pro dp1 = new delegate_pro(funcA);
//delegate_pro dp2 = new delegate_pro(funcB);
int a = dp1(2, 2);
Console.WriteLine("--------委托测试--------");
Console.WriteLine(a);
Console.ReadLine();
}
}
}
上面例子中有静太函数 funcA ,funcB ;两个函数的参数类型不完全相同. 另有非静态函数 funcC,funcD;
定义一个委托对象: delegate int delegate_pro(int p1,int p2); 其中两参数都为整型.
如果在入口函数中像这样 dp2 = new delegate_pro(funcB);由于funcB的参数列表不符合委托 delegate_pro的定义将会产生如下异常:
错误 1 “funcB”的重载均与委托“Console_interface1.Program.delegate_pro”不匹配 C:\Documents and Settings\applehat\My Documents\Visual Studio 2005\Projects\Console_interface1\Console_interface1\Program.cs 38 32 Console_interface1
这部分也是体现了C#.NET是一种强类型安全的语言,它规定了语言的规范必须相当的严密.
在正确的定义 delegate_pro dp1 = new delegate_pro(funcA); 之后:
那我们便可以这样来使用它了,如 int a = dp1(2, 2); 两个参数都是整型,符合委托对象的定义.这样就调用了静态函数 funcA,并让它成功地返回了值.
有的人会发现,我们到底什么时候才有必要使用委托呢? 也许在些看不出些问题来.比如你如果这样:在入口函数中写: int b = funcA(funcB(5, "s"), 2);也将是可行.
static void Main(string[] args)
{
delegate_pro dp1 = new delegate_pro(funcA);
//delegate_pro dp2 = new delegate_pro(funcB);
int a = dp1(2, 2);
int b = funcA(funcB(5, "s"), 2);
Console.WriteLine("--------委托测试--------");
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadLine();
}
这并没有通过委托就实现了 函数funcA,funcB的调用,并将funcB作参数正确地传递给了函数funcA. .
有的人理解委托是由皇帝分配给N个大臣的一系列任务,我觉得也未尝不可.只是这些任务是特定的,有相当的角色性的. 特定的任务只能交给特定的大臣去完成.那么大臣要想完成特定的任务就必须按照任务的特定要求去执行. 就好像武官最好是带兵打仗,文官弄弄纸墨一样.
这里我们先谈委托的构造机制.对于初学C#的朋友来说比较好理解.高手的朋友请直言指正. 至于它在什么有必须使用和正确的使用我们以后再接着讨论.
委托的概念是将引用存储为函数, 在此肯定先要理解什么是引用[不谈]. 它的机制事实上是比较简单的. 但如何用好委托却并非一件完全简单的事情. 以下是对委托的一些个人看法.
首先委托要用关键字delegate ,在用委托之前要先生成一个委托对象,再将此对象与其能够匹配的函数相联系起来,就起到通过委托来实现函数调用的目的.
事实上委托的功能远不止如此, 在事件驱动的原理中它就相当重要, 也体现出了.NET技术的相关核心功能模式.
大家都知道在静态函数中是不能直接调用非静态函数, 这也是因为在静态函数中不能把函数的指针作参数传递.
下面给个极为简单的例子来说明我对委托的理解:
namespace Console_interface1
{
class Program
{
delegate int delegate_pro(int p1,int p2);
private static int funcA(int para1, int para2)
{
return para1 * para2;
}
private static int funcB(int para1, string para2)
{
return para1*2;
}
private int funcC(int a)
{
int c = funcA(funcD(2), 22);
return a * c;
}
private int funcD(int a)
{
return a * 2;
}
static void Main(string[] args)
{
delegate_pro dp1 = new delegate_pro(funcA);
//delegate_pro dp2 = new delegate_pro(funcB);
int a = dp1(2, 2);
Console.WriteLine("--------委托测试--------");
Console.WriteLine(a);
Console.ReadLine();
}
}
}
上面例子中有静太函数 funcA ,funcB ;两个函数的参数类型不完全相同. 另有非静态函数 funcC,funcD;
定义一个委托对象: delegate int delegate_pro(int p1,int p2); 其中两参数都为整型.
如果在入口函数中像这样 dp2 = new delegate_pro(funcB);由于funcB的参数列表不符合委托 delegate_pro的定义将会产生如下异常:
错误 1 “funcB”的重载均与委托“Console_interface1.Program.delegate_pro”不匹配 C:\Documents and Settings\applehat\My Documents\Visual Studio 2005\Projects\Console_interface1\Console_interface1\Program.cs 38 32 Console_interface1
这部分也是体现了C#.NET是一种强类型安全的语言,它规定了语言的规范必须相当的严密.
在正确的定义 delegate_pro dp1 = new delegate_pro(funcA); 之后:
那我们便可以这样来使用它了,如 int a = dp1(2, 2); 两个参数都是整型,符合委托对象的定义.这样就调用了静态函数 funcA,并让它成功地返回了值.
有的人会发现,我们到底什么时候才有必要使用委托呢? 也许在些看不出些问题来.比如你如果这样:在入口函数中写: int b = funcA(funcB(5, "s"), 2);也将是可行.
static void Main(string[] args)
{
delegate_pro dp1 = new delegate_pro(funcA);
//delegate_pro dp2 = new delegate_pro(funcB);
int a = dp1(2, 2);
int b = funcA(funcB(5, "s"), 2);
Console.WriteLine("--------委托测试--------");
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadLine();
}
这并没有通过委托就实现了 函数funcA,funcB的调用,并将funcB作参数正确地传递给了函数funcA. .
有的人理解委托是由皇帝分配给N个大臣的一系列任务,我觉得也未尝不可.只是这些任务是特定的,有相当的角色性的. 特定的任务只能交给特定的大臣去完成.那么大臣要想完成特定的任务就必须按照任务的特定要求去执行. 就好像武官最好是带兵打仗,文官弄弄纸墨一样.
这里我们先谈委托的构造机制.对于初学C#的朋友来说比较好理解.高手的朋友请直言指正. 至于它在什么有必须使用和正确的使用我们以后再接着讨论.
解决方案 »
- .net email群发的问题
- ×符号在gridview里面获取的时候变成了× 求解答.
- 收藏 Entity framework(EF) Code First这用用法什么优点?实现IRepository接口?究竟有什么优点?
- 阿里妈妈广告问题
- 求高手,求师傅!
- 急需为什么图标飘浮再IE7上不能正确飘浮?
- asp.net在一个母版页里可以link多个css吗?
- asp.net如何实现域名查询啊?(
- 企业人事管理系统演示,同样找不到工作,同样郁闷,同样散分
- 从一个页的Button事件中如何获取在iframe中另一页中选种checkbox的值?
- asp.net初级问题
- 大家是怎样应用函数的参数的?
只是callback只有指针没有参数,类型,返回值而己,delegate多了严格限制了。。
c : lpWinPro = MyWinPro
c# : WinProClick = (class)MyWinPro(args)
我承认委托的确在动态编程上提供了程序员比较方便的实现方法。要我来解释委托的话一句话就可了:
委托就是 C/C++中指向函数的指针。只不过微软赋予了这个概念一个新的名字叫做委托!有人说C#/Java里面没有指针。这个纯属谬论,委托就是一个指向函数的指针。这个就和Java里面叫做Package的东东在dotNet里面叫做nameSpace.
请问2者有本质性的区别吗?