2

我在 Windows Phone 7 C# 示例中找到了以下方法。在其中,您可以看到方法中使用的术语成功失败。我尝试使用任一术语转到定义,但 Visual Studio 没有跳转到任一术语的定义。我尝试使用“操作”、“成功”、“失败”、“C#”和“参数”等术语在 Google 上搜索,但没有找到任何有用的信息。在这种情况下,成功失败是宏还是类似的东西?我在哪里可以了解它们的作用以及如何使用它们?请注意,将鼠标悬停在失败上时的工具提示帮助显示“参数 Action<string> failure ”。

    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);
        }
    }
4

2 回答 2

4

它们是被用作“回调函数”的委托。基本上,它们是提供给可以在该函数内部调用的另一个函数的函数。也许更小的样本会更有意义:

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..所以它调用ifFalse委托。如您所见,ifFalse打印到控制台:

PerformCheck(1 == 2, 
            ifTrue: () => Console.WriteLine("Yep, its true"),
            ifFalse: () => Console.WriteLine("Nope. False."));

而这个将打印为真..因为1 == 1评估为真。所以它调用ifTrue

PerformCheck(1 == 1, 
            ifTrue: () => Console.WriteLine("Yep, its true"),
            ifFalse: () => Console.WriteLine("Nope. False."));
于 2013-10-24T21:53:17.033 回答
2

您可以将Action(and also Func) 视为包含其他方法的变量。

您可以传递、分配和基本上对Action任何其他变量执行任何操作,但您也可以像方法一样调用它。

假设您的代码中有两种方法:

public void Main(){
    Action doWork;
    doWork = WorkMethod;
    doWork();
}

private void WorkMethod(){
    //do something here
}

您将 WorkMethod 分配给操作,就像您对变量进行任何分配一样。然后,您可以像调用方法一样调用 doWork。在这个例子中它不是特别有用,但您可能会看到标准变量的所有好处是如何应用的。

您以几乎相同的方式使用 anAction和 a 。Func唯一真正的区别是 aAction代表 avoid并且 aFunc需要返回类型。

您也可以使用泛型。例如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是返回类型,即使它首先出现在实际的方法签名中。

于 2013-10-24T22:12:00.463 回答