![]() |
1
85
我假设您正在研究.NET 3.5实现?我认为.NET 4实现略有不同。
但是,我有一种潜移默化的怀疑,这是因为即使虚拟实例方法也可以非虚拟地调用
在空引用上
. 在伊利诺伊州是可能的。我去看看我能不能生产一些可以称之为
编辑:好的,这里有一些有趣的代码:
我通过编译以下C代码得到了这个:
…然后用
原来,那是
那么,当我们重新组装它时会发生什么?好吧,有了.NET 4.0,我们可以得到:
嗯,.NET 2.0怎么样?
现在更有趣了…我们已经很清楚地进入了
足够的字符串…我们试着自己实现引用相等,看看是否可以
与之前相同的步骤-拆解、更换
请注意,尽管另一个答案引用了
this C++ question
我们在这里更加狡猾…因为我们打电话给
事实上的
方法不是虚拟的。正常情况下,即使c++/CLI编译器也会使用
编辑:我刚刚注意到一些事情……我实际上没有调用正确的方法 任何一个 我们的小样本程序。第一种情况是这样的:
下面是第二个电话:
在第一种情况下,我
意味
打电话
如果您向C_override添加一点控制台输出,您可以看到不同之处-除非您更改IL以显式调用它,否则不会调用它,如下所示:
所以,我们到了。对空引用的实例方法的乐趣和滥用。 如果你做到了这一点,你可能还想看看我关于 how value types can declare parameterless constructors …在IL。 |
![]() |
2
17
原因在于
听起来可怕吗?确实有一点。然而,大多数编译器都确保不会发生这种情况。.call指令只有在
但并非所有语言都是如此,出于某些原因,我不清楚BCL团队选择进一步强化
另一个可以弹出的情况是反向pinvoke调用。 |
![]() |
3
9
简而言之,像C这样的语言在调用方法之前强制您创建这个类的一个实例,但是框架本身并没有。CIL有两种不同的方法来调用函数:
(好吧,如果你数一数calli,newobj等的话,差不多是五个,不过我们还是简单点吧) |
![]() |
4
4
这个 source code 有此评论:
|
![]() |
5
1
让我们看看…
这将保存一个函数调用。除此之外,也许更好地理解
编辑:
啊,所以equalshelper函数接受
|
![]() |
6
0
如果参数(obj)未转换为字符串,则strb将为空,结果应为假。例子:
写
记住,对任何参数类型都调用string.equals()方法,而不仅仅是对其他字符串。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |