【问题标题】:How are extension methods compiled?扩展方法是如何编译的?
【发布时间】:2010-10-14 10:10:17
【问题描述】:

C#编译器如何实现扩展方法?

【问题讨论】:

    标签: c# .net-3.5


    【解决方案1】:

    流程和重载解析一模一样:

    Func(myObject);
    

    编译器检查所​​有名为“Func”的函数并尝试将 myObject 的静态类型与参数匹配(可能使用转换,向上转换为基类)。如果成功,则调用相应的函数。

    如果你意识到你可以“以正常方式”调用扩展方法,那么它就会清除:

    static class MyExtensions
    {
        public static void MyFunc(this string arg)
        {
            // ...
        }
    }
    
    string a = "aa";
    MyExtensions.MyFunc(a); // OK
    a.MyFunc();             // same as above, but nicer
    

    对于给定的类型(这里是字符串),编译器只查找第一个参数上带有“this”修饰符的所有静态函数,并尝试匹配 . (在本例中为“a”)与函数中的参数类型。

    【讨论】:

      【解决方案2】:

      类的实例方法有一个隐藏的参数。一个例子:

      class Example {
        public void Foo(int arg) {}
      }
      

      当 JIT 编译器完成后实际上看起来像这样,转换回 C# 语法:

      static void Foo(Example this, int arg) {}
      

      隐藏的参数是您可以在实例方法中使用 this 的原因。 JIT 编译器从您提供的对象引用中找出要传递的参数,以调用 Foo 方法。

      如您所知,它现在是非常到扩展方法的短跳。

      【讨论】:

        【解决方案3】:

        编译器首先在基类中查找与函数签名匹配的函数。如果找不到它,则它会寻找扩展名。如果扩展与基类方法具有相同的签名,则将调用基类方法。

        这可能会有所帮助: Extension Methods

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-19
          • 1970-01-01
          • 1970-01-01
          • 2022-07-16
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          相关资源
          最近更新 更多