【问题标题】:Why we use "this" in Extension Methods?为什么我们在扩展方法中使用“this”?
【发布时间】:2010-04-04 12:08:14
【问题描述】:

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

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

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

【问题讨论】:

  • Scott Hanselman 有一篇很好的文章解释了“this”关键字的重要性。 hanselman.com/blog/…
  • 我个人更喜欢属性。类似 [Extends(typeof(foo)] 的东西,然后有一个名为 value 的隐式变量,类似于属性。它会更具表现力,不需要重用现有关键字。只是我个人的看法。

标签: c#


【解决方案1】:

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

【讨论】:

  • 因此您不必像在 VB.Net 中那样使用 ExtensionAttribute 标记方法。
  • C# 有更美味的语法糖,这就是我喜欢它的原因。
【解决方案2】:

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

  • 足够接近表明这与实例方法有关
  • 这是一个现有的关键字...
  • ...在那个地方使用是非法的

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

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

【讨论】:

    【解决方案3】:

    它只是将其标记为扩展方法,这是他们选择使用的格式来将方法定义为扩展方法,而不是普通的静态方法(无论如何它在内部都是这样调用的)。这仅适用于编译器(和智能感知),在幕后您的代码编译方式与直接调用静态方法相同。

    这个方法的定义:

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

    需要与此区分开来:

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

    否则你会在包含命名空间的静态类中包含所有静态方法的智能感知,这是非常不可取的。

    【讨论】:

      【解决方案4】:

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

      10.6.9 扩展方法

      当方法的第一个参数 包括 this 修饰符,即 方法被称为扩展 方法。扩展方法只能是 在非泛型、非嵌套中声明 静态类。第一个参数 扩展方法可以没有 除此以外的修饰符,以及 参数类型不能是指针 输入。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-06
            • 1970-01-01
            • 1970-01-01
            • 2017-10-06
            • 2017-11-09
            • 2012-07-24
            • 1970-01-01
            相关资源
            最近更新 更多