在一个方法中有多个同名的变量

本文关键字:变量 方法 一个 | 更新日期: 2023-09-27 18:17:06

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

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

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

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

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

这是一个好方法吗?是否存在缺陷或普遍认为它降低了代码的可读性?

在一个方法中有多个同名的变量

基本上,如果编译器没有报错,并且你的代码易于阅读和理解,那就没有什么问题。

例如:

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

我刚刚测试了你的代码,因为通常情况下,VSCodeAnalysis和r#和StyleCop紧盯着我的脖子,我本以为会有很多警告。但是没有。他们都保持沉默。因此,它似乎并不违反任何微软的编码准则。

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

遵循KISS原则:"保持简单,傻瓜"。

我会谨慎使用这种方法;它会妨碍可读性和可调试性。我以前遇到过这样的情况,我有两个断点监视两个不同的变量,而我以为我只监视一个变量。

c#强加的规则确保你的方法不使用不一致的名称是复杂的。如果您有兴趣了解更多有关它们的信息,请参阅: http://blogs.msdn.com/b/ericlippert/archive/tags/simple +名称/