【问题标题】:Can I pass a condition to a method as parameter in C#我可以将条件作为 C# 中的参数传递给方法吗
【发布时间】:2012-04-18 06:14:50
【问题描述】:

我有 2 个按钮执行相同的功能但处于不同的状态。 那里的代码是这样的。

private void button1_Click(){
// do function1

if(condition){
    ...decrement an integer
    //do function2
}
}


private void button2_Click(){
// do function1

if(another condition){
    ...increment an integer

    //do function2
}
}

我可以将条件 1 和条件 2 传递给方法吗?

【问题讨论】:

  • 您可以将 lambda 传递给您的方法并执行或不执行它
  • 是的,你可以......但你能详细说明这个问题吗?你在这里说什么条件? inc,dec 可以通过,是的。
  • @Sharmi 条件大于或小于。
  • @user1340443 可能你应该看看类似的问题:stackoverflow.com/q/3324023/1278315 。可能会有所帮助,但我没有遇到过这种情况...... :) 特别是。这个stackoverflow.com/a/3324052/1278315 可能会有所帮助:)

标签: c# c#-4.0


【解决方案1】:

是的,你可以。但是你能做的仍然有限。考虑一下这个

public void Foo(Action action, Func<Boolean> someCondition) {
    if (someCondition() == true) action();
}

【讨论】:

  • 为什么写if (condition() == true) 而不是简单的if (condition())
  • 个人喜好,我认为它更具可读性。我也使用 condition() == false。
  • 一旦条件方法被重命名,使用例如:if(IsAvailable() == true) { // do something} 将增加比阅读简单性更多的噪音。与if(IsAvailable()) { // do something}比较
【解决方案2】:

你可以试试这样的:

    private void buttonClick()
    {
        DoSomething(condition ? true : false);
    }
    private void DoSomething(bool increment)
    {
        // do stuff

        if (increment)
            ++index;
        else
            --index;
    }

【讨论】:

  • 为什么写condition ? true : false 而不是简单的condition
  • condition ? true : false如果你在我的代码库里写这样的代码,你会被枪毙的!
【解决方案3】:

为什么不将重复的代码提取到方法中?

private void Function1() 
{ 
   // do function1
}

private void Function2()
{
   // do function2
}

private void button1_Click()
{
   Function1() ;

   if(condition)
   {
       //...decrement an integer
       Function2();
   }
}

private void button2_Click()
{
  Function1();

  if(another condition)
  {
    //...increment an integer
    Function2();
  }
}

如果你有很多结构相同的类似方法,那么考虑创建

private void DoSomething(Func<bool> condition, Action action)
{
    Function1();
    if (condition())
    {
        action();
        Function2();
    }
}

并以这种方式调用它:

private int value;

private void button2_Click()
{
    DoSomething(() => value < 5, () => value++);
}

当然,如果您需要将一些参数传递给条件或操作,您应该更改FuncAction 类型。如果您需要从操作中返回一些值,也可以使用 Func 而不是 Action

private int value;

private void button2_Click()
{
    DoSomething((x) => x % 2 == 0, (x) =>  x.ToString());
}

private void DoSomething(Func<int, bool> condition, Func<int, string> action)
{
    Function1();
    if (condition(value))
    {
        string result = action(value);
        Function2();
    }
}

如果您的条件和操作不是那么简单,请使用命名方法而不是 lambda:

private bool FooCondition(int x)
{
   // complex condition here
}

private string BarAction(int x)
{
    // complex action here
}

private void button2_Click()
{
    DoSomething(FooCondition, BarAction);
}

【讨论】:

  • Function2 从 function1 中获取一些值。
  • @user1340443 然后不要将函数提取到方法中。或者将这些值作为参数传递。
【解决方案4】:

您可以通过将条件 1 和条件 2 包装在方法中并将它们用作委托来实现此目的,这允许将它们传递到方法中。

例如,您可以让带有委托签名的消息期望采用 x 个输入并返回布尔值的方法。然后为条件 1 和 2 创建与该签名匹配的方法,并将适当的方法传递给方法。

在方法内部,您只需像调用方法一样调用委托(实际上就是方法)。

查看 Microsoft 围绕代表的文档:http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

【讨论】:

  • 如果这些条件相对简单,lambda 可能比每个条件单独的方法更具可读性。
【解决方案5】:

如果您使用的是 .NET 3.0,则可以将 Func 传递给该方法。带参数和不带参数的两个类都存在。 Func 返回一个布尔值和一个参数,可以用这样的 lambda 编写:

condition => {
  if (condition)
    index++;
  else
    index--;
}

Func 可以保存到变量中并根据需要传递。

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2018-07-04
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多