5

我已经阅读了开源 c# 代码并且有很多奇怪的语法(对我来说)。

他们使用this关键字声明方法参数,如下所示:

这个对象@object

这是什么意思?

如果我删除数据类型之前的“this”关键字,那么它的工作方式会有所不同吗?

4

2 回答 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);

编译器无论如何都会简单地将所有“扩展方法调用”转换为标准静态方法调用,但扩展方法调用仍然只能根据this type name语法对有效的扩展方法起作用。

一些指导方针

这些是我自己的,但我发现它们很有用。

  • 扩展方法的可发现性可能是一个问题,因此请注意您选择包含它们的命名空间。我们在 .NET 命名空间下有非常有用的东西,例如System.Collections或其他。不太有用但其他“常见”的东西往往会受到影响Extensions.<namespace of extended type>,这样可发现性至少通过约定是一致的。
  • 尽量不要在广泛的范围内扩展常用类型,您不希望MyFabulousExtensionMethod出现在object整个应用程序中。如果需要,可以将范围(命名空间)限制为非常具体,或者绕过扩展方法并直接使用静态类 - 这些不会污染 IntelliSense 中的类型元数据。
  • 在扩展方法中,“this”可以是null(由于它们如何编译成静态方法调用)所以要小心,不要假设“this”不为空(从调用方看来,这看起来像是对空值的成功方法调用目标)。

这些是可选的,并不详尽,但我发现它们通常属于“好”建议的旗帜。YMMV。

于 2013-05-10T12:32:45.477 回答
4

'this type name' 语法用于扩展方法。

例如,如果我想向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 是它的标识符。

@ 语法允许通常保留的变量名称。

于 2013-05-10T12:34:21.850 回答