C# 将值传递给方法
假设你有:C# 将值传递给方法,c#,.net,coding-style,named-parameters,C#,.net,Coding Style,Named Parameters,假设你有: public void TestFishsticks() { var fishes = GetFishstick(false); } private object GetFishstick(bool getBigFishes) { return FishsticksManager().GetFishsticks(getBigFishes); } vs 这有什么原因吗 在我目前的公司代码库中,我们似乎两个都做,但似乎没有理由一个超过另一个。我可以看到第二个选项的可读性有
public void TestFishsticks()
{
var fishes = GetFishstick(false);
}
private object GetFishstick(bool getBigFishes)
{
return FishsticksManager().GetFishsticks(getBigFishes);
}
vs
这有什么原因吗
在我目前的公司代码库中,我们似乎两个都做,但似乎没有理由一个超过另一个。我可以看到第二个选项的可读性有了小小的提高,因为您可以直接看到参数名,但您仍然可以通过intellisense看到它?命名参数主要是在C#4.0中引入的,以提高可读性。你实际上不必使用它们。有些人喜欢在某些情况下使用它们,有些人不喜欢。这基本上取决于你 它可以极大地提高可读性,特别是当您不想在一直阅读代码时触发intellisense时(或者更糟的是,查看打印输出)。比较这两个:
CalculateBMI(123, 178); // What do the numbers mean?
CalculateBMI(weightInKg: 123, heightInCentimeters: 178); // Clearer IMHO.
但是,同时使用命名参数和可选参数可以使您仅为可选参数列表中的少数参数提供参数。例如,这种功能大大方便了对COM接口的调用。这里使用的是命名参数 它们可以大大增加可读性。特别是对布尔人 考虑:
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以后的表格 命名参数有助于我们不去记忆或查找被调用方法的参数列表中的参数顺序。每个参数的参数可以由参数名指定。因为只有一个参数,所以(就个人而言)没有意义。如果您有多个,那么它将有助于更改顺序或快速可读性(如果您不关心方法intellisense)是的,它主要是一种可读性。当你有一长串的可选参数时,它也会派上用场,比如说
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);
还应注意的是,intellisense并非始终可用。例如,在诸如WinMerge之类的diff查看器中读取代码,或者偶尔在记事本中读取代码。通过使用命名参数,可读性仍然存在,即使intellisense没有
似乎没有理由一个比另一个强
使用命名参数的一些好理由:
代码更容易一眼就能理解,尤其是当参数为false
或null
或0
或”
等时
命名参数与可选参数配合使用效果良好。如果只需要指定其中的几个参数,那么接受十几个参数的方法可以有一个简化的调用站点
在早期开发过程中,面对重新排序的重构,代码是健壮的。如果您在发布给客户之前进行了重大更改,请更改:
void M(int width, int height)
到
然后所有的代码都说
M(height: 123, width: 456);
M(123, 456);
仍然是正确的,但是
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);
void
方法不能返回
任何东西。@作为一个好的调用,我没有意识到我将它们作为void!命名参数,而不是参数。参数总是有名称:)根据我对Henk的评论,这些都是命名参数,还有可选参数。+1,还有:在某些情况下,特别是当参数是bool类型时,传递的值不包含任何提示它的含义。枚举至少有它的名称,但true或false可以表示任何内容。因此,当传递布尔值时,使用命名参数可以提高可读性。谢谢Jon,我仍然倾向于混淆术语。相应地更新了我的答案。这是一个很好的答案。。。但值得一提的是,这并不全是彩虹和独角兽。使用命名参数的代价是参数名成为方法签名的一部分。因此,参数的简单重命名(例如拼写)可能会破坏指定名称的代码。公开暴露的API(尤其是分发给第三方的API)现在对参数名也变得敏感了,而以前并没有。@LBushkin:这一点很好,但我要借此机会指出,这并不是什么新鲜事;VB一直都有这个特性,因此,对于任何可能按名称使用该参数的VB程序员来说,更改公共方法的参数名总是一个突破性的改变。