【问题标题】:Passing values into methods将值传递给方法
【发布时间】:2011-12-07 17:26:51
【问题描述】:

假设你有:

public void TestFishsticks()
{ 
   var fishes = GetFishstick(false);
}

private object GetFishstick(bool getBigFishes)
{
  return FishsticksManager().GetFishsticks(getBigFishes);
}

public void TestFishsticks()
{ 
   var fishes = GetFishstick(getBigFishes: false);
}

private object GetFishstick(bool getBigFishes)
{
  return FishsticksManager().GetFishsticks(getBigFishes);
}

这有什么原因吗?

在我目前的公司代码库中,我们似乎两者兼而有之,但似乎没有理由将其置于另一个之上。我可以看到第二个选项的可读性有所提高,因为您可以立即看到参数名称,但无论如何您都可以通过智能感知看到它?

【问题讨论】:

  • void 方法不能return 任何东西。
  • @asawyer 好电话,我没有意识到我将它们视为无效!

标签: c# .net coding-style named-parameters


【解决方案1】:

命名参数主要在 C# 4.0 中引入以提高可读性。您实际上不必使用它们。有些人喜欢在某些情况下使用它们,而另一些人则不喜欢。这基本上取决于你。

它可以大大提高可读性,尤其是当您不想在一直阅读代码时触发智能感知(或者更糟糕的是,查看打印输出)。比较这两个:

CalculateBMI(123, 178); // What do the numbers mean?
CalculateBMI(weightInKg: 123, heightInCentimeters: 178); // Clearer IMHO.

但是,同时使用命名参数和可选参数可以让您只为可选参数列表中的几个参数提供参数。例如,此功能极大地方便了对 COM 接口的调用。

【讨论】:

  • 根据我对 Henk 的评论 - 这些被命名为 arguments,并且还有可选的 parameters
  • +1,并且要提一下:在某些情况下,特别是当参数是 bool 类型时,传递的值不包含任何暗示它的含义。一个枚举至少有它的名字,但真或假可能意味着任何事情。因此,在传递布尔值时,它可以提高使用命名参数时的可读性。
  • 谢谢乔恩,我仍然倾向于混淆这些术语。相应地更新了我的答案。
【解决方案2】:

您在这里使用的是命名参数

它们可以大大增加可读性。特别是对于布尔值。

考虑:

var date = GetDate(2011, 2, 3);  // 'feb 3' or '2nd of march' ? 

如果你读了

var date = GetDate(year:2011, month:2, day:3); 

你知道的更多。它可以避免这么多的混乱。作为奖励,您可以随意称呼它:

var date = GetDate(month:2, day:3, year:2011);  // same date.

命名参数只能从 C#4 开始使用。

【讨论】:

  • 命名参数,而不是参数。参数总是有名字:)
【解决方案3】:

命名参数帮助我们不记得或查找被调用方法的参数列表中的参数顺序。每个参数的参数可以由参数名称指定。这没有意义(个人),因为你只有一个参数。如果您有多个,那么这将有助于更改顺序或快速可读性(如果您不关心方法 intellisense)

【讨论】:

    【解决方案4】:

    是的,它主要是为了可读性。当您有一长串可选参数时,它也可以派上用场,例如;

    public bool GetFishstick(int x = 1, int y = 2, int z = 3)
    {
    ...
    }
    
    // Called as such: The other optional parameters (x,y) are supplied automatically.
    var fish = GetFishstick(z: 10);
    
    // Compare to the alternative where you have to provide them.
    var fish = GetFishstick(1,2,10);
    

    还应注意,智能感知并非始终可用。例如,在 WinMerge 之类的差异查看器或偶尔的记事本中阅读代码。即使没有智能感知,使用命名参数仍然具有可读性。

    【讨论】:

      【解决方案5】:

      似乎没有理由互相排斥

      使用命名参数的一些充分理由:

      代码一目了然,特别是当参数为falsenull0""等时。

      命名参数适用于可选参数。如果您只需要指定其中的几个参数,那么采用十几个参数的方法可以有一个简化的调用站点。

      在早期开发过程中,面对重新排序重构,代码是健壮的。如果您在发布给客户之前进行了重大更改,则更改:

      void M(int width, int height)
      

      void M(int height, int width)
      

      然后所有的代码都说

      M(height: 123, width: 456);
      

      仍然是正确的,但是代码中说的

      M(123, 456);
      

      需要更新。

      同样,这使得代码在更改此指定矩形的方法时更加健壮:

      M(int top, int bottom, int left, int right)
      

      到这个方法:

      M(int top, int height, int left, int width)
      

      一个明显的重大变化。代码

      M(top: 10, bottom: 20, left: 30, width: 40)
      

      方法改变时会报错。此代码不会,并且会改变行为:

      M(10, 20, 30, 40);
      

      【讨论】:

      • 这是一个很好的答案......但值得指出的是,它并不全是彩虹和独角兽。使用命名参数的权衡是参数名称成为方法签名的一部分。结果,参数的简单重命名(例如拼写)可能会破坏指定名称的代码。公开的 API(尤其是那些分发给第三方的 API)现在也对参数名称变得敏感,而以前它们是不敏感的。
      • @LBushkin:说得好,但我会借此机会指出这并不是什么新鲜事; VB 一直都有这个特性,所以对于任何可能按名称使用该参数的 VB 程序员来说,更改公共方法的参数名称总是一个重大变化。
      猜你喜欢
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多