【发布时间】:2009-07-01 05:18:48
【问题描述】:
我需要编写一个委托函数,它可以围绕基本的 UDP 调用“包装”一些 while/try/catch 代码来验证链接。 对于一个没有参数的函数,我让它适用于 Func,但我不能让它适用于有参数(但没有返回)的 Action。如果编译器不抱怨,我似乎无法以合乎逻辑的方式传递参数。
我做错了吗?我是 C# 新手,我本质上是在尝试模仿函数指针的想法。我不应该重载这个函数吗?我知道你不能重载委托(我认为这就是 Func 和 Action 存在的原因)。
这行得通:
protected TResult udpCommand<TResult>(Func<TResult> command)
{
TResult retValue = default(TResult);
while (!linkDownFail)
{
try
{
retValue = command();
break;
}
catch
{
LinkStateCallBack(ip, getLinkStatus());
if (linkDownFail) throw new LinkDownException();
Thread.Sleep(100);
}
}
return retValue;
}
但这不是:
protected void udpCommand<T>(Action<T> command(T value))
{
while(!linkDownFail)
{
try
{
command(value);
break;
}
catch
{
LinkStateCallBack(ip, getLinkStatus());
if (linkDownFail) throw new LinkDownException();
Thread.Sleep(100);
}
}
return;
}
调用约定(适用的):
udpCommand<uint>(someUdpCommand);
【问题讨论】:
-
附加 - 你实际上并不需要 T;你可以只取
Action(无参数),然后调用:udpCommand(() => SomeMethod(123)); -
这是否允许我为 udpCommand 提供不同数量的输入参数,而不会使它重载,例如最多 4 个参数?这就是我需要做的。我还需要一个 Func 和一个 Action 吗?