C#语言中,'this'关键字有什么用?

5

我已经阅读了开源的C#代码,其中有很多对我而言奇怪的语法。

他们使用this关键字来声明方法参数,像这样:

this object @object

这是什么意思?

如果我删除数据类型前面的'this'关键字,那么它会以不同的方式工作吗?


3
C# 语法非常好,事实上,如果你将它与 C++ 进行比较。 - Richard J. Ross III
2个回答

23

听起来像是一个扩展方法

@符号允许变量名称与C#关键字相同 - 我个人倾向于避开它们。

如果移除this关键字,它将不再是扩展方法,而仅仅是一个静态方法。根据调用代码的语法,它可能无法编译,例如:

public static class IntegerMethods
{
    public static int Add(this int i, int value)
    {
        return i + value;
    }
}

int i = 0;

// This is an "extension method" call, and will only compile against extension methods.
i = i.Add(2); 
// This is a standard static method call.
i = IntegerMethods.Add(i, 2);
编译器会将所有“扩展方法调用”转换为标准静态方法调用,但是扩展方法调用仍然只能针对有效的扩展方法按照“此类型名称”语法进行操作。
一些指导方针:
这些是我自己的,但我觉得它们很有用。
- 发现扩展方法的可发现性可能是一个问题,因此请注意您选择包含它们的命名空间。我们在 .NET 命名空间下拥有非常有用的东西,例如 System.Collections 等。不太有用但其他“常见”的东西通常会进入 Extensions.<扩展类型的命名空间>,以便通过约定至少保持可发现性的一致性。 - 尽量不要在广泛范围内扩展常用类型,您不希望MyFabulousExtensionMethod 出现在整个应用程序中的 object 上。如果需要,请将作用域(命名空间)限制在非常特定的范围内,或者绕过扩展方法直接使用静态类 - 这些不会污染 IntelliSense 中的类型元数据。 - 在扩展方法中,“this”可以为 null(由于它们编译为静态方法调用),因此请小心,不要假设“this”不为 null(从调用方面来看,这看起来像对空目标的成功方法调用)。
这些是可选的,不是详尽无遗的,但我认为它们通常属于“好”的建议范畴。您的情况可能有所不同。

我唯一使用它们的时候是用于扩展方法,将this参数命名为@this。虽然我得出的结论是这样做“太可爱了”。 - Matthew Watson
@MatthewWatson,我刚刚将this参数称为self。有效。 - Daren Thomas

4

“此类型名称”语法用于扩展方法。

例如,如果我想要为字符串添加一个UnCamelCase方法 (这样我就可以使用"HelloWorld".UnCamelCase()来产生 "Hello World") - 我会写下这个:

public static string UnCamelCase(this string text)
{
    /*match any instances of a lower case character followed by an upper case 
     * one, and replace them with the same characters with a space between them*/
    return Regex.Replace(text, "([a-z])([A-Z])", "$1 $2");
}

this string text 表示你正在处理的具体字符串实例,而 text 是它的标识符。

@ 语法允许使用通常被保留的变量名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接