【问题标题】:Pass in default value as optional parameter in C#在 C# 中将默认值作为可选参数传递
【发布时间】:2012-07-18 16:00:46
【问题描述】:

除了省略参数之外,有没有办法“告诉”带有可选参数的方法使用默认值?我想语法看起来像这样:

DoSomething(myParam: default)                         //calling the method

public void DoSomething(int myParam = 5) { ... }      //method definition

这样做的原因是为了避免这种不带参数的方法的重载之间的歧义。换句话说,我不想调用这个方法:

public void DoSomething() { ... }

提前致谢。

【问题讨论】:

  • 最简单的方法是给它们起不同的名字..
  • 为什么不带参数的方法和带参数的方法都可选?如果我要尝试使用您的代码,我会对两者之间的区别感到困惑(当然,您应该记录它,然后我可以理解,但我建议您尽可能避免这种情况)。
  • @TimS。 - 我有几个公共方法,如GetObjectById()GetObjectByName,...等,包括一个包罗万象的GetObject();所有这些都调用使用可选参数的私有GetObject(..)。这是因为这些函数的调用者不支持可选参数。
  • 由于GetObject(..) 是私有的,我建议重命名它。
  • @friendlycello 标准做法是使用运行实际代码的所有参数进行一个重载,然后使用许多其他方法来调用一个大重载并指定一个或多个参数.我已经添加了一个带有此示例的答案。

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


【解决方案1】:

如果您不希望用户调用不带参数的 DoSomething 方法,只需将其设为私有,如下所示:

private void DoSomething();

【讨论】:

  • 当然还有其他选择。 1. 给方法不同的名字 2. 使用反射 3. 为第一个方法(未使用)添加一个附加参数,以便可选的“真实”参数大小写与其他重载的签名不匹配。 4.删除其他方法。 5. 将不是int 的参数(可能未使用)添加到其他方法。
  • 所有这些解决方案都改变了方法本身,而不仅仅是它们的访问说明符,我回答的假设是他想用相同的参数保持相同的名称。
  • 好吧,反射方法没有。除此之外,我的回答是假设他需要保持相同的访问说明符。 有些东西 需要改变(除了使用反射)。这只是您想要更改的什么的问题。更改访问说明符是一种选择,更改签名(以多种方式之一)是另一种途径。
  • 6.使用显式接口实现可能是另一种选择。使这两种方法中的至少一种成为接口的显式定义。
  • @Servy 你是对的,说“我想不出任何其他方法来实现这一点”是错误的,但我认为更改访问说明符是最简单的事情 - 更改方法的签名可能有问题。
【解决方案2】:

在这种特殊情况下,您似乎根本不应该使用可选参数。它们旨在让您的生活更轻松。当他们停止这样做时,可能是时候停止使用它们了。

您可以使用这种通用方法通过各种重载实现可选参数的相同通用目标:

public void Foo(int param1, int param2, int param3){ /* actual Foo code goes here */ }

public void Foo(int param1, int param2) { Foo(param1, param2, 5); }

public void Foo(int param1) { Foo(param1, 0, 5); }

public void Foo() { Foo(42, 0, 5); }

这是可选参数旨在避免的,但有时回到这个样板代码会更简单,即使它使代码有点膨胀。

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2021-07-27
    • 2022-01-14
    相关资源
    最近更新 更多