将值传递给方法

时间:2011-10-14 12:24:55

标签: 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(getBigFishes: false);
}

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

这有什么理由吗?

在我目前的公司代码库中,我们似乎都做了两个,但似乎没有理由一个在另一个。我可以通过第二种选择看到一个小的可读性改进,因为你可以立即看到参数名称,但是你可以通过intellisense看到它吗?

5 个答案:

答案 0 :(得分:7)

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

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

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

但是,通过一起使用命名参数和可选参数,您可以从可选参数列表中仅为少数参数提供参数。例如,此功能极大地方便了对COM接口的调用。

答案 1 :(得分:4)

  

似乎没有理由让其他人

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

代码更容易理解,特别是当参数为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);

答案 2 :(得分: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这样的差异查看器中读取代码,或偶尔读取记事本。即使intellisense不是,也可以通过使用命名参数来实现可读性。

答案 3 :(得分: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开始提供。

答案 4 :(得分:1)

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