我在Windows Phone 7 C#示例中找到了以下方法。在其中,您可以看到方法中使用的术语成功和失败。我尝试使用任一术语转到定义,并且Visual Studio没有跳转到任一术语的定义。我尝试使用术语“操作”,“成功”,“失败”,“C#”和“参数”搜索Google,但没有找到任何有用的内容。 成功和失败在此上下文宏或类似内容中?我在哪里可以得到他们做什么以及如何使用它们的解释?请注意,悬停在失败时的工具提示帮助显示“参数操作<字符串>失败”。
public void SendAsync(string userName, string message, Action success, Action<string> failure)
{
if (socket.Connected) {
var formattedMessage = string.Format("{0};{1};{2};{3};{4}",
SocketCommands.TEXT, this.DeviceNameAndId, userName, message, DateTime.Now);
var buffer = Encoding.UTF8.GetBytes(formattedMessage);
var args = new SocketAsyncEventArgs();
args.RemoteEndPoint = this.IPEndPoint;
args.SetBuffer(buffer, 0, buffer.Length);
args.Completed += (__, e) => {
Deployment.Current.Dispatcher.BeginInvoke(() => {
if (e.SocketError != SocketError.Success) {
failure("Your message can't be sent.");
}
else {
success();
}
});
};
socket.SendAsync(args);
}
}
答案 0 :(得分:3)
它们是被用作“回调函数”的委托。基本上,它们是提供给可以在该函数内部调用的另一个函数的函数。也许较小的样本会更有意义:
static void PerformCheck(bool logic, Action ifTrue, Action ifFalse)
{
if (logic)
ifTrue(); // if logic is true, call the ifTrue delegate
else
ifFalse(); // if logic is false, call the ifFalse delegate
}
在下面的示例中打印了False,因为1 == 2
的计算结果为false。因此,logic
方法中的PerformCheck
为false ..因此它会调用ifFalse
委托。如您所见,ifFalse
打印到控制台:
PerformCheck(1 == 2,
ifTrue: () => Console.WriteLine("Yep, its true"),
ifFalse: () => Console.WriteLine("Nope. False."));
然而这个将打印为true ..因为1 == 1
的计算结果为true。所以它调用了ifTrue
:
PerformCheck(1 == 1,
ifTrue: () => Console.WriteLine("Yep, its true"),
ifFalse: () => Console.WriteLine("Nope. False."));
答案 1 :(得分:2)
您可以将Action
(以及Func
)视为包含其他方法的变量。
您可以传递,分配并基本上对Action
执行任何其他变量的操作,但您也可以将其称为方法。
假设您的代码中有两种方法:
public void Main(){
Action doWork;
doWork = WorkMethod;
doWork();
}
private void WorkMethod(){
//do something here
}
您可以将WorkMethod分配给操作,就像对变量进行任何分配一样。然后,您可以将doWork称为方法。它在这个例子中并不是特别有用,但您可以看到标准变量的所有好处是如何应用的。
您以完全相同的方式使用Action
和Func
。唯一真正的区别是Action
表示void
而Func
需要返回类型。
您也可以使用泛型。例如,Action<int>
表示带有签名
void methodName(int arg){}
Action<int, string>
将是
void methodName(int arg1, string arg2){}
Func
类似,Func<int>
将是:
int methodName(){}
Func<string, int>
将是:
int methodName(string arg){}
重要的是要记住Func
定义中的 last 类型是返回类型,即使它首先出现在实际方法签名中。