为什么我们在扩展方法中使用“this”?

时间:2010-04-04 12:08:15

标签: c#

我想问为什么我们在扩展方法(C#语言)中的参数之前使用“this”关键字........... 喜欢这个功能:

    public static int ToInt(this string number)
    {
        return Int32.Parse(number);
    }

我知道我们必须使用它,但我不知道为什么。

6 个答案:

答案 0 :(得分:9)

因为这是你告诉编译器它首先是扩展方法的方式。否则它只是一个普通的静态方法。我猜他们选择了this,因此他们不必提出新的关键字,并且可能会破坏旧代码。

答案 1 :(得分:6)

有关信息,this作为上下文关键字的重要性主要在于它避免引入 new 关键字。每当您引入新关键字时,您都有可能破坏将其用作变量/类型名称的代码。 this有一些有用的功能:

  • 足够接近表示这与实例方法相关
  • 这是一个现有的关键字......
  • ......在该位置使用时本来是非法的

这意味着不会破坏现有代码。

除了选择this作为关键字之外,它只是编译器的一种方便的语法,比手动添加[Extension]更方便。如果没有,它只是一个静态方法,没有任何特殊行为。

答案 2 :(得分:1)

它只是将它标记为扩展方法,这是他们选择将该方法定义为扩展方法的格式,而不是普通的静态方法(无论如何在内部调用它)。这只是仅适用于编译器(和intellisense),在您的代码编译的基础上,就像您直接调用静态方法一样。

方法的定义:

public static int ToInt(string number) //non extension

需要与此区别开来:

public static int ToInt(this string number) //extension

否则你的intellisense包含了包含的命名空间中静态类中的每个静态方法,这是非常不受欢迎的。

答案 3 :(得分:1)

主要是因为它是C# spec定义扩展方法的方式。 请参阅第10.6.9节

  

10.6.9扩展方法

     

当一个方法的第一个参数   包含修饰符,即   方法据说是一种扩展   方法。扩展方法只能是   以非泛型,非嵌套方式声明   静态类。第一个参数   扩展方法可以没有   除此之外的修饰语和   参数类型不能是指针   类型。

答案 4 :(得分:0)

为了将方法识别为扩展方法。编译器怎么知道呢?

答案 5 :(得分:0)

这只是选择用于表示扩展方法的语法。这是关于C#和vb.net之间的扩展方法语法差异的一个有趣的观点: Extension Method Implementation differences between C# and VB.NET