【问题标题】:Optional parameters: constants vs direct declaration in method? [closed]可选参数:常量与方法中的直接声明? [关闭]
【发布时间】:2013-05-16 16:57:21
【问题描述】:

对于带有可选参数的方法,更好的方法是什么:

  1. 声明常量并将其用作默认参数:

  1. 或者在方法中声明默认参数:

对于图片而不是代码,我很抱歉,但所见即所得的编辑器有问题。

【问题讨论】:

  • 随心所欲。代码在功能上是相同的。这纯粹是用户偏好。
  • WYSIWYG editor is buggy - 不,不是。你可能不知道如何正确使用它?
  • 声明常量通常是更好的做法。它使您可以访问这些默认值以用于其他处理等。这可能是在提问的“征求意见”方面,但是......
  • @HighCore 我在 stackoverflow 上使用了很多次,但在这篇文章中它不想识别我的代码。我试了很多次。
  • 只是从不更改默认值。那会让人不高兴。

标签: c# .net methods constants optional-parameters


【解决方案1】:

正如其他人已经指出的那样,它对生成的 IL 没有任何影响。

我想对使用默认参数提出一个切入点:

因为它们已编译到软件中,所以在您发布软件后更改它们可能会导致错误。您可以使用不同的默认设置来使用不同的软件组件。

最好(如果可以的话)使用一个特殊的“默认值”指示器。然后在方法内部,您检测这些特殊值并替换适当的默认值。这样您就可以更可靠地更改未来版本中的默认值。

例如,对于您的 CreateApple() 示例,您可以执行以下操作:

static Apple CreateApple(string size = "<<default>>", string colour = "<<default>>")
{
    if (size == "<<default>>")
        size = "Big";

    if (colour == "<<default>>")
        colour = "Red";

我认为在这种情况下您应该使用枚举 - 但同样适用于枚举和其他类型。只要您的值不属于该参数的有效正常范围,您就可以使用它来表示“默认”。

【讨论】:

    【解决方案2】:

    这真的是个人喜好问题。两者将基本相同。

    const 在许多情况下可能具有优势。如果您在代码中的多个位置使用该值,我更喜欢 const 声明而不是指定内联,因为您不会重复该值,并且它使检查变得更简单(并且以后可能会更改),因为它保存在一个地方。

    【讨论】:

      【解决方案3】:

      可以在类中放置默认值。
      它的好处是在课堂上得到执行。
      对任何阅读课程的人来说都是显而易见的。

      public class Apple
      {
          private string size  = "big";
          private string color = "red";
          public string  Size  { get { return size; }  set { size  = value; } } 
          public string  Color { get { return color; } set { color = value; } }
          public Apple() 
          { } // for private as default 
          public Apple(string Size, string Color) 
          { size = Size; color = Color; }   // if you don't want the private defaults
      }
      

      如果你想要一个的默认值而不是另一个

      Apple apple = new Apple("small", (new Apple()).Color);
      

      【讨论】:

      • 这根本不能回答问题...
      • @Servy 这是你的意见,必须用 -1 来实现。
      • 这甚至没有向构造函数显示任何可选参数,您不能将这些成员中的任何一个用作构造函数的可选参数,因为它们不是编译时常量。对此没有任何意见。这绝不会回答问题。
      • OP 省略了构造函数。我也省略了构造函数。所以你不同意。这就是我处理默认值的方式。
      • 对不起,这不仅仅是构造函数,它是任何可选参数。在任何情况下,您仍然不能将其中任何一个用作可选参数的默认值,因为它们不是编译时常量。您也没有解释 OP 列出的两种方法之间的区别,这是实际的问题,也没有解释您的“解决方案”如何比任何一种更好(甚至它是如何工作的,因为我断言它没有t)。里面有一些意见,但总的来说这是客观事实。
      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多