5

I use Stylecop for Resharper and whenever I call something in my class, Stylecop tells me to use the this keyword. But the IDE says this is redundant code (which it sure is), so why should I use the this keyword?

Does redundant code mean its not needed (obviously) and the compiler won't even do anything with the this keyword? So I assume the this keyword is just for clarity.

Also, with the CLR, do things like this fall consistently across languages? So if the answer is that the compiler doesn't even touch the this keyword and it is just for presentation and clarity, then the same is true for VB.NET? I assume it is all for clarity as stylecop keeps an eye on this and Fxcop (which I will use later on) keeps an eye on my code's quality from a technical point of view.

Thanks

4

6 回答 6

12

It's for clarity and to prevent any ambiguity between a class member and a local variable or parameter with the same name.

The IL it compiles to will not be any different.

于 2009-01-16T02:42:18.307 回答
3

大多数时候只是为了清楚起见,但有时它是必需的。

using System;

class Foo
{
    String bar;

    public Foo(String bar)
    {
        this.bar = bar;
    }
}

在这里,您需要消除字段和构造函数参数this之间的歧义。显然,更改参数或字段的名称可以完成同样的事情。barbar

于 2009-01-16T02:44:22.903 回答
3

在所有情况下,无论有没有性能差异this- 编译器仍然隐式执行它,将 aldarg.0注入 IL。

为了完整起见,还有另一种强制使用this(不包括消歧、ctor-链接和传递this给其他方法):扩展方法。要在当前实例上调用扩展方法,您必须符合条件this(即使对于常规方法它是隐式的)。

当然,在大多数情况下,您只需将常规实例方法添加到类或基类中......

class Foo {
    void Test() {
        this.Bar(); // fine
        Bar(); // compiler error
    }
}
static class FooExt {
    public static void Bar(this Foo foo) { }
}
于 2009-01-16T08:10:44.023 回答
0

在 C# 中,这是对当前类实例的引用(在 VB.NET 中是我)。它通常用于完全限定班级成员。例如,考虑这个 C# 类:

public class MyClass
{
    int rate;

    private void testMethod()
    {
        int x;

        x = this.rate;
    }
}

这在上面的代码中不是必需的,但在阅读速率属于类而不是方法的代码时会增加即时清晰度(搜索 SO,你会发现很多关于使用 this 的意见)。它的语义行为在 VB 中是相同的——并且它的使用不会造成性能损失。

于 2009-01-16T02:45:01.483 回答
0

除了提供的清晰示例之外,“this”关键字的唯一其他有效用法是将对象的当前实例作为参数传递。

于 2009-01-16T03:10:51.277 回答
0

这只是为了清楚起见,人们可以争论什么更好。Python 根本不支持省略“self”标识符。

此外,对于 CLR,这样的事情是否会始终如一地跨越语言?因此,如果答案是编译器甚至没有触及 this 关键字而只是为了表示和清晰,那么 VB.NET 也是如此吗?

在 JVM 中肯定(也对于 CLR,我几乎可以肯定)总是生成“this”关键字的代码,即使从源代码中省略了 - 所以就像总是添加 this 关键字一样。所以,我认为任何 .NET 编译器都不会产生不同的输出,因此不会有性能损失。

然后,这取决于语言。例如 JScript(甚至 JScript.NET)不允许像 Python 一样省略“this”,因为有函数(所以“this.a()”是方法调用,“a()”是函数调用) ,并且因为编译器不知道任何类型的成员 - 它们仅在运行时才知道(嗯,这确实不是一个不可能解决的问题,另一个问题更相关)。

于 2009-01-16T03:55:39.860 回答