如何在构造函数c#中声明void?

时间:2015-11-24 10:42:26

标签: c#

我发现这个代码(没有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();
    }
}

2 个答案:

答案 0 :(得分:5)

创建事件处理程序时,您在处理程序构造函数中提供指向方法的指针。这不是“空白”,它是指向类型为void的方法的委托。

其构造函数应类似于:

delegate void HandlerMethod(objects s, PingCompletedEventArgs  e);
class PingCompletedEventHandler {
    PingCompletedEventHandler(HandlerMethod handler) { ... }
}

现在,您可以使用new PingCompletedEventHandler(abc)调用此构造函数,因为abcvoid类型的方法,期望类型为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);