使用C#动作解释成功/失败条款?

时间:2013-10-24 21:43:35

标签: c# .net visual-studio windows-phone-7 parameters

我在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);
        }
    }

2 个答案:

答案 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称为方法。它在这个例子中并不是特别有用,但您可以看到标准变量的所有好处是如何应用的。

您以完全相同的方式使用ActionFunc。唯一真正的区别是Action表示voidFunc需要返回类型。

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