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

C# 一个方法中具有相同名称的多个变量,c#,naming-conventions,C#,Naming Conventions,我喜欢正确命名变量,但在某些情况下很难做到 因此,如果我的对象实现了IDisposable,那么我可以使用: using (var whatever = new Whatever()) { //... } 但这种情况很少见,所以我找到了另一种处理方法——匿名块(不确定它是如何正确调用的): 这是一个好方法吗?是否存在任何陷阱或普遍认为它会降低代码的可读性?基本上,如果编译器没有抱怨,并且您的代码可读且易于理解,那么这没有错 例如: foreach (var foo in foos) {

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

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

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

我只是测试了你的代码,因为通常情况下,随着vscodealysis和R#和StyleCop在我的脖子上呼啸而过,我会期待很多警告。但是没有,他们都保持沉默。因此,它似乎并不违反任何微软的编码准则

但是:如果您需要创建多余的匿名块只是为了避免因变量名而导致的编译器错误,那么这不再简单。基本上,您是在隐藏编译器,而隐藏永远不会解决问题。在我看来,如果为每个变量选择一个精确的名称(为类型命名并不太好),并删除匿名块,那么编写代码会更好


遵循接吻原则:“保持简单,愚蠢”

我会对这种方法持谨慎态度;它会影响可读性和可调试性。我曾经有过这样的情况,当我认为我在观察一个变量时,我有两个断点在观察两个不同的变量

C#为确保您的方法不会不一致地使用名称而强加的规则非常复杂。如果您有兴趣了解更多关于它们的信息,请参阅:


即使我已经读过这个问题,为什么不按照变量的用途命名变量,而不是根据它的声明命名呢?为什么不能直接覆盖
任何内容<代码>变量whatever=new()。。。whatever=new()通常我会将该方法拆分为不同的方法。。。至少在很多情况下,布莱恩·格雷厄姆(Brian Graham)有时会用什么来命名变量,这对我来说很奇怪(名字变得太长)。所以,在我无法给出正常名称之后,我更愿意给出它声明的名称。您应该看到
var task=foo?new FooTask():new BarTask();task.Run()对我来说似乎是最可读的。但如果他们不同时实现一些
IRunnableTask
接口或类似的东西,这是不可能的。@YoryeNathan是的,我同意,我只是想提出一个符合OP问题的案例。我用
foreach
块更新了我的答案,这些块更好地说明了这一点。我从不使用枚举变量名,因为我认为这在命名转换中也是一种不好的做法。因此,在这种情况下,最好给出名称,这样可以更好地发现变量的用途。但在我的例子中,变量变得奇怪且太长,并且没有一个比
var fooTask=newfootask(foo)更容易阅读
var barTask=新的barTask(bar);//它被称为“喝酒”
。假设酒吧的类型相同,那么把它命名为foo或task(或task1)怎么样?我刚刚注意到.NET中有一个异常,但对此并不确定。编译器并不抱怨太难。
foreach (var foo in foos)
{
   var task1 = new FooTask(foo);
   task1.Run();
}
foreach (var bar in bars)
{
   var task2 = new BarTask(bar);
   task2.Run();
}