gpt4 book ai didi

c# - C#中 'this'是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:35 24 4
gpt4 key购买 nike

在“通过 C# 实现 CLR”的第 170 页:


public sealed class Program {
public Int32 GetFive() { return 5; }
public static void Main() {
Program p = null;
Int32 x = p.GetFive(); // In C#, NullReferenceException is thrown
}
}

理论上,上面的代码没问题。当然,变量 p 是空的,但是当调用一个非虚函数时方法 (GetFive),CLR 只需要知道 p 的数据类型,即 Program。如果确实调用了 GetFive,此参数的值为 null。自从争论不在 GetFive 方法内部使用,不会抛出 NullReferenceException。


请原谅我的愚蠢。我记得 CLR 通过“this”定位真正的方法代码,它总是隐含地出现在方法 delcare 的第一个参数上,为什么它说“当调用非虚拟时”方法 (GetFive),CLR 只需要知道 p' 的数据类型?

最佳答案

CLR 不会对非虚拟方法进行空值检查。基本上,如果使用 call 指令调用方法,CLR 不会检查空的 this 指针。相反,callvirt 指令总是检查是否为空。但是,无论该方法是否为虚方法,C# 都会发出 callvirt 指令。

这段话的意思是,如果 C# 编译器为非虚拟方法发出语义上更合适的 call 指令而不是 callvirt 指令,那么有问题的代码不会抛出 NullReferenceException。我记得,编译器团队决定几乎总是发出 callvirt 指令,因为它可以更好地处理版本控制(而且 JIT 可以将 callvirt 优化为 call).

参见 http://www.pvle.be/tag/clr/

关于c# - C#中 'this'是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921893/

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