我发现这个代码(没有conpiler错误,它的平均代码没有错误)是" PingCompletedEventHandler"像PingCompletedEventHandler(abc)这样的构造函数有静态void abc(对象s,PingCompletedEventArgs e){}对吗?
static PingCompletedEventHandler Ping_completed(object s, PingCompletedEventArgs e)
{
// This code work fine, it used method void abc below
PingCompletedEventHandler a = new PingCompletedEventHandler(abc);
value.Add("abc");
lock (@lock)
{
instances -= 1;
}
if (e.Reply.Status == IPStatus.Success)
{
string abcd = string.Concat("Active IP: ", e.Reply.Address.ToString());
value.Add("abc");
value.Add(abcd);
result += 1;
}
return a;
}
static void abc(object s, PingCompletedEventArgs e)
{
}
他们怎么能这样做。我已经在我的代码中测试过,它不起作用。这是我的测试:
class Class1
{
static void abcd(int a){
}
public
// Error here: Class1.abcd(int)' is a 'method' but is used like a 'type'
Class1(abcd)
{
}
}
class Class3
{
public static void Main()
{
Class1 asd = new Class1();
}
}
答案 0 :(得分:5)
创建事件处理程序时,您在处理程序构造函数中提供指向方法的指针。这不是“空白”,它是指向类型为void
的方法的委托。
其构造函数应类似于:
delegate void HandlerMethod(objects s, PingCompletedEventArgs e);
class PingCompletedEventHandler {
PingCompletedEventHandler(HandlerMethod handler) { ... }
}
现在,您可以使用new PingCompletedEventHandler(abc)
调用此构造函数,因为abc
是void
类型的方法,期望类型为object
且类型为PingCompletedEventArgs
的参数
进一步阅读代表here on MSDN
编辑:从.NET 3.0开始,还有更容易阅读的Action
- 类型,可用于不返回任何内容的方法(void
)。因此,您也可以使用PingCompletedEventHandler(Action<object, PingCompletedEventArgs> handler)
而不是定义自己的代理。
进一步编辑:要使测试工作正常,Class1
的构造函数应如下所示:Class1(Action<int> theAction)
。
答案 1 :(得分:0)
当您想要一个函数作为方法或构造函数的参数时,您必须使用Delegate
如果您有Void返回类型,则最简单的方法是使用Action<...>
;如果您还有其他类型的返回类型,则使用Func<T, ...>
。
在您的情况下,它将如下所示:
public ClassConstructor(Action<YourParameter> myDelegate)
{
}
例如:
这是一个非常简单的功能,你想创建一个代表:
private static int Add(int a, int b)
{
return a + b;
}
然后你需要一个委托接受int
作为返回类型和两个int
作为参数。
因此,您可以像这样定义Func<...>
并指定原始方法:
Func<int, int, int> addDelegate = Add;
用法就像使用Add
只使用其他名称一样:
var result = addDelegate(2, 5);