2

所以假设你有:

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

这有什么原因吗?

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

4

5 回答 5

7

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

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

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

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

于 2011-10-14T12:28:25.100 回答
4

似乎没有理由互相争执

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

代码一目了然更容易理解,尤其是当参数是falseor nullor 0or""等​​时。

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

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

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);
于 2011-10-14T15:21:13.363 回答
2

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

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 之类的差异查看器或偶尔的记事本中阅读代码。即使没有智能感知,使用命名参数仍然具有可读性。

于 2011-10-14T12:33:38.200 回答
1

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

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

考虑:

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 开始使用。

于 2011-10-14T12:29:36.460 回答
1

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

于 2011-10-14T12:32:37.540 回答