C# Foo()与this.Foo()的比较

C# Foo()与this.Foo()的比较,c#,refactoring,C#,Refactoring,我有一个同事使用C#重构工具。由于某些原因,该工具性能良好: this.Foo() 结束 现在我们要求他关掉它,只是因为让所有的代码自动重写很烦人,但这不是重点 我是错过了什么,还是这是错的?我到底为什么要这个.Foo()?这是一种时尚。有时人们认为这会使代码更加清晰——显然,有些人发现明确方法调用的目标很有帮助。就我个人而言,我发现这个的虚假使用会分散注意力。如果你想使用它,就使用它 如果你不想使用它,就不要使用它 这里没有正确的答案 如果出于某种原因,您有一个命名约定,其中仅名称不足以确定

我有一个同事使用C#重构工具。由于某些原因,该工具性能良好:

this.Foo()
结束

现在我们要求他关掉它,只是因为让所有的代码自动重写很烦人,但这不是重点


我是错过了什么,还是这是错的?我到底为什么要
这个.Foo()

这是一种时尚。有时人们认为这会使代码更加清晰——显然,有些人发现明确方法调用的目标很有帮助。就我个人而言,我发现这个的虚假使用会分散注意力。

如果你想使用它,就使用它

如果你不想使用它,就不要使用它

这里没有正确的答案


如果出于某种原因,您有一个命名约定,其中仅名称不足以确定您正在查看的是局部变量、方法参数、实例字段、属性还是方法,那么您应该修复命名约定,而不是用
this作为本地字段的前缀。
来区分它们与本地变量。

我认为这归结为语法与语义的问题。
this.Foo()
的参数是它非常明确地表示Foo()是什么以及它来自哪里。毫无疑问,它是传递给方法的参数,还是声明的静态类(谁知道在哪里)。它是当前对象上的一个方法,句号。如果你做得少了,你就会放弃清晰的语义,转而选择更紧凑的语法


反对它的明显理由是:鼠标悬停并按住ctrl键并单击。

此示例演示了如何使用
This
关键字来明确描述变量的范围:

class Item
{
    int id;

    public Item (int id)
    {
        this.id = id;
    }

}

正如其他答案所指出的,这在很大程度上是一个风格问题

很多时候,调用
Foo()
如果没有
this.
,将是明确无误的,但有时它可能会增加清晰度。例如:

EventHandler foo = GetEventHandlerFoo();
EventHandler baz = GetEventHandlerBar();
foo();
this.Bar();
baz();
在这种情况下,
this.
前缀有助于使方法调用从委托调用中脱颖而出

这有必要吗?不,Lasse V.Karlsen正确地指出,
this.
只是一个命名约定的代理,使得它明确无误


但我发现,出于类似的原因,我会经常在本地属性上使用
this.Foo
前缀,这也是一个风格问题。

我总是使用
this。
因为它明确地显示了事物的位置。我甚至没有使用重构工具来做这件事。我手工输入。

如果反对它的唯一理由是鼠标悬停,我实际上会支持它,因为你应该能够在屏幕上阅读代码,而不用用鼠标寻找源代码。命名约定会解决这个问题。我倾向于同意。这是一个“是的,我有一个偏好,但不是那么强烈,我愿意参加一场圣战,在一个标准和惯例会议中”的问题。我基本上爱上了c#,因为与我习惯的语法相比,它简洁、有意义。不过,稍微罗嗦一点也不一定是坏事。是的,同意,这就是这个问题的问题所在,一切都归结于选择和意见。我将投票结束这个问题。投票结束这个问题是主观的和有争议的。这里没有明确的正确答案,这一切都归结于观点和风格。基本上,这是一个伪装的轮询。请注意,如果您试图使用扩展方法(假设您的类实现了IEnumerable,并且希望调用this.Count()),则需要使用“this.”来触发扩展方法查找。无论如何,这是一个可怕的命名约定。我不使用
这个。
但我不会告诉人们不要使用它,但我会严肃地告诉你(或任何其他人)不要使用这种命名约定。修复命名约定问题,以及
之间的问题。
再次成为一个意见问题。@Lasse V.Karlsen在本例中,为了演示您首选的约定,您会使用什么名称作为参数而不是
id
?@Lasse V.Karlsen:我同意这不是最佳约定,但是一些IDE,例如NetBeans,会使用它自动生成构造函数…@Lasse:Thanx用于共享。。您能告诉我如何命名字段和参数吗?我喜欢在字段前面加上
\uuuu
。所以
int\u id在这种情况下。再一次,踏入主观意见的领域。。。我倾向于在没有字段的构造函数中设置自动属性时所做的操作。
EventHandler foo = GetEventHandlerFoo();
EventHandler baz = GetEventHandlerBar();
foo();
this.Bar();
baz();