gpt4 book ai didi

c# - 扩展方法在内部是如何实现的

转载 作者:太空狗 更新时间:2023-10-29 20:00:26 24 4
gpt4 key购买 nike

内部如何实现扩展方法?我的意思是当编译器看到扩展方法的声明时会发生什么,以及当调用扩展方法时在运行时会发生什么。

是否涉及反射?或者当你有一个扩展方法时,它的代码是否被注入(inject)到目标类类型元数据中,并带有一些额外的标志,指出这是一个扩展方法,然后 CLR 知道如何处理它?<​​/p>

那么一般来说,幕后会发生什么?

最佳答案

正如其他同事所说,它只是一个静态方法。一切都与编译器有关,我们可以说 CLR 甚至不知道扩展方法。您可以尝试检查 IL 代码..

这是一个例子

static class ExtendedString
{
public static String TestMethod(this String str, String someParam)
{
return someParam;
}
}

static void Main(string[] args)
{
String str = String.Empty;
Console.WriteLine(str.TestMethod("Hello World!!"));
........
}

这是 IL 代码。

  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "Hello World!!"
IL_000d: call string StringPooling.ExtendedString::TestMethod(string,
string)
IL_0012: call void [mscorlib]System.Console::WriteLine(string)
IL_0017: nop

如你所见,它只是一个静态方法的调用。该方法未添加到类中,但编译器使其看起来像那样。在反射层,您可以看到的唯一区别是添加了 CompilerServices.ExtensionAttribute。

关于c# - 扩展方法在内部是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6543827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com