一个方法中具有相同名称的多个变量

时间:2013-06-04 16:07:09

标签: c# naming-conventions

我喜欢正确命名的变量,但在某些情况下很难做到。

因此,如果我的对象实现IDisposable,那么我可以使用:

using (var whatever = new Whatever()) { //... }

但这种情况很少见,所以我找到了另一种方法来处理它 - 匿名阻止(不确定它是如何正确调用的):

//...
{
    var whatever = new Whatever();
    //...
}
//...
if (condition)
{
    var whatever = new Whatever();
}

这是一个好方法吗?是否有任何陷阱或普遍认为它会降低代码可读性?

3 个答案:

答案 0 :(得分:3)

基本上,如果编译器没有抱怨并且您的代码可读且易于理解,那么这没有任何问题。

例如:

foreach (var foo in foos)
{
   var task = new FooTask(foo);
   task.Run();
}
foreach (var bar in bars)
{
   var task = new BarTask(bar);
   task.Run();
}

这实际上(在我看来)比

更容易阅读
foreach (var foo in foos)
{
   var task1 = new FooTask(foo);
   task1.Run();
}
foreach (var bar in bars)
{
   var task2 = new BarTask(bar);
   task2.Run();
}

答案 1 :(得分:1)

我刚刚测试了你的代码,因为通常情况下,VSCodeAnalysis和R#以及StyleCop在我的脖子上呼吸,我会期待很多警告。但不是。他们都保持沉默。所以它似乎并不违反任何Microsoft编码指南。

然而:如果您需要创建多余的匿名块只是为了避免由于变量名称导致的编译器错误,那么它就不再容易和简单了。基本上,您正在隐藏编译器,隐藏永远不会解决问题。从我的角度来看,如果你为每个变量选择一个精确的名称(无论如何命名它的类型都不是很好),那么这将是更好的代码,并删除匿名块。

遵循KISS原则:“保持简单,愚蠢”。

答案 2 :(得分:1)

我会对这种方法持谨慎态度;它可能会妨碍可读性和可调试性。我曾经遇到过这样的情况:当我以为我正在观看一个时,我有两个断点看两个不同的变量。

C#强制要求确保您的方法不使用名称的规则很复杂。如果您有兴趣了解更多相关信息,请参阅:

http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/