C#中的默认委托

时间:2010-11-01 06:39:23

标签: c# delegates

C#中默认委托的名称是什么,它不带参数并返回void?我记得有一位代表,但我不记得它的名字。

5 个答案:

答案 0 :(得分:12)

在.NET 3.5之前,声明自己是相当普遍的。现在,Action是一个很好的候选者,但ThreadStart常用(相当容易混淆),或者MethodInvoker 如果你已经引用了winforms。

快速测试(注意,在.NET 4.0中运行,只使用一些库 - 所以并非详尽无遗):

var qry = from asm in AppDomain.CurrentDomain.GetAssemblies()
          from type in asm.GetTypes()
          where type.IsSubclassOf(typeof(Delegate))
          let method = type.GetMethod("Invoke")
          where method != null && method.ReturnType == typeof(void)
          && method.GetParameters().Length == 0
          orderby type.AssemblyQualifiedName
          select type.AssemblyQualifiedName;
foreach (var name in qry) Console.WriteLine(name);

显示更多候选人:

System.Action, mscorlib...
System.CrossAppDomainDelegate, mscorlib...
System.IO.Pipes.PipeStreamImpersonationWorker, System.Core...
System.Linq.Expressions.Compiler.LambdaCompiler+WriteBack, System.Core...
System.Net.UnlockConnectionDelegate, System...
System.Runtime.Remoting.Contexts.CrossContextDelegate, mscorlib...
System.Threading.ThreadStart, mscorlib...
System.Windows.Forms.AxHost+AboutBoxDelegate, System.Windows.Forms...
System.Windows.Forms.MethodInvoker, System.Windows.Forms...

答案 1 :(得分:7)

有几个这样的代表,但我认为你正在寻找Action。另一个选项是MethodInvoker(在System.Windows.Forms中)。

答案 2 :(得分:5)

您可能正在寻找“Action”。

一些相关的阅读:

答案 3 :(得分:3)

我可能会以不同的方式向您解释您的问题,但是:

如果您正在考虑用于事件处理的委托,则约定是使用EventHandler。该代表不采用“否”参数,但它基本上没有信息。

答案 4 :(得分:2)

在.net 2.0中,MethodInvoker代表是推荐的方式。它是最通用的。正如它的名字所暗示它调用一种方法。其他可能具有您描述的相同属性,但它们具有不同的名称,表明在特定区域中的其他用法或非常具体的用法。