Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在C中把条件作为参数传递给方法吗#_C#_C# 4.0 - Fatal编程技术网

C# 我可以在C中把条件作为参数传递给方法吗#

C# 我可以在C中把条件作为参数传递给方法吗#,c#,c#-4.0,C#,C# 4.0,我有两个按钮做相同的功能,但在不同的条件。 有这样的代码 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 //d

我有两个按钮做相同的功能,但在不同的条件。 有这样的代码

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以及递增和递减传递给方法吗?

您可以通过将条件1和条件2包装到方法中,并将它们用作委托,从而将它们传递给方法

例如,具有委托签名的消息可能需要一个接受x个输入并返回布尔值的方法。然后为条件1和条件2创建与该签名匹配的方法,并将适当的方法传递给该方法

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


查看Microsoft关于代理的文档:

您可以尝试以下方法:

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

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

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

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

如果你有很多相似的方法,那么就考虑创建< /P>

private void DoSomething(Func<bool> condition, Action action)
{
    Function1();
    if (condition())
    {
        action();
        Function2();
    }
}
如果您的条件和操作不是那么简单,请使用命名方法而不是lambdas:

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

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

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

如果您使用的是.NET3.0,则可以向该方法传递一个。这两个类都采用参数,但不存在参数。 返回布尔值和参数的
Func
可以使用如下lambda编写:

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

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

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

可以。但你的能力仍然有限。考虑这个

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

如果这些条件相对简单,则a可能比每个条件的单独方法更具可读性。您可以将lambda传递给您的方法并执行它,也可以不执行。是的,您可以。。。但是你能详细说明这个问题吗?你说的是什么情况?inc,dec可以通过,是。@Sharmi条件大于或小于。@user1340443可能是您应该看一个类似的问题:。可能有帮助,但我没有遇到这种情况…:)特别是,这可能会有帮助:)为什么要编写
条件?真:假
而不是简单的
条件
条件?真:假
如果你在我的代码库中写这样的代码,你会被枪毙的!为什么写<代码>如果(条件()==true)< /代码>而不是简单的<代码>(条件())< /代码>?个人偏好,我认为它更可读。我还使用condition()==false。重命名condition方法后,使用例如:
if(IsAvailable()==true){//do something}
将增加比简单读取更多的噪音。与
if(IsAvailable()){//do something}
Function2比较,从function1获取一些值。@user1340443然后不要将函数提取到方法。或者将这些值作为参数传递。