C#可选参数/需要多个

时间:2015-07-30 08:56:16

标签: c# methods parameters parameter-passing optional-parameters

是否可以同时获得2个可选参数的要求?这是一个例子:

public void ParamChoise(string A, bool B = false, string C = "Y")
    {
        // Stuff here
    }

如果B是可选的,我希望函数在B为真时需要C.从我的逻辑那样的东西:

public void ParamChoise(string A, (bool B = false, string C = "Y"))

无法通过Google搜索找到任何内容。对我来说,一种可能的方式是:

        /// <summary>
        /// If you want behaviour XXX to be enabled, please enter "C" for usage.
        /// </summary>
        /// <param name="A"></param>
        /// <param name="C"></param>
        public void ParamChoise(string A, string C = "Y")
        {
            // Stuff here
        }

我确实可以给我的函数添加这样的评论,但是对于一个不合逻辑的给定参数写评论对我来说很糟糕。

这个案子可能是一个不好的例子,但我相信我将来会再次遇到这种情况。

非常感谢:)。

编辑清除内容:
参数的可能组合:

  • 仅限
  • A&amp; (B&amp; C)
  • 不是A&amp;乙
  • 不是A&amp; C(因为B表示需要C的点)

3 个答案:

答案 0 :(得分:6)

我认为你需要旧方法 - 方法重载。

// b = true
public void ParamChoise(string A, string C)

// b = false
public void ParamChoise(string A)

他们应该拨打原始版本的私人版本

private void ParamChoiseInternal(string A, bool B = false, string C = "")

你应该确保给2个公共方法一个准确传达其含义的名称 - 这将有助于程序员(可能你,我知道)为他们当前的状态调用正确的方法。

更新后

与上面相同,名称反映了要求,您仍然可以调用原始的私有方法。重载确保您的一致性

public void AOnly(string A)
public void AAndBAndC(string A, bool B, string C)

努力破译这两个:

  

不是A&amp; B没有C !!!
  不是A和C(因为如果需要C,B给出点)

答案 1 :(得分:1)

您可以使用named arguments

public void ParamChoise(string A = "", bool B = false, string C = "Y") {...}

// call it
ParamChoise(A: "123");
ParamChoise(C: "123");
ParamChoise(C: "123", A: "123");
ParamChoise(B: true, C: "123", A: "123");

我发现这对于有许多可选参数的方法非常有用。

使用明确的参数名称指定,您可以在以后随时添加新的可选参数 ,而不会破坏现有代码。

答案 2 :(得分:1)

从我可以收集的内容中,你想要C为可选的,而b是假的;作为方法超载的练习,我认为你得到的最接近的是:

void ParamChoise(string A, string C)
void ParamChoise(string A, bool B = true, string C = "Y")

你仍然需要在调用者中决定是否提供Bool ......这使得它现在无法做到:

void ParamChoiseBIsFalse(string A, string C)
void ParamChoiseBIsTrue(string A, string C = "Y")

您刚刚获得了无法直接转换为简单重载的复杂逻辑。您可以将该逻辑放在被调用者或调用者