作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
众所周知,早期绑定(bind)是声明特定数据类型的对象的概念,它不能容纳任何其他类型的对象。虽然后期绑定(bind)是声明泛型对象的概念,并且可以容纳任何其他类型的实例。考虑这个例子:
public abstract class Animal
{
public virtual string Name { get { return "Animal"; } }
}
public class Dog : Animal
{
public override string Name { get { return "Dog"; } }
}
public class Cat : Animal
{
public override string Name { get { return "Cat"; } }
}
public class Test
{
static void Main()
{
Animal animal = new Dog();
Animal animalTwo = new Cat();
Console.WriteLine(animal.Name);
Console.WriteLine(animalTwo.Name);
}
}
我的问题是编译器什么时候会识别对象的函数调用,是在编译时还是在运行时?如果我不清楚,我很抱歉。 但我想问的是,虚拟覆盖和虚拟方法的概念是否涉及后期绑定(bind)? .. 如果不是,那这怎么可能。
最佳答案
运行时。
虚函数意味着调度在运行时被路由到事件对象引用上的函数。在 C++ 中,这是通过称为 vtable 的指针表完成的。我不确定 C# 是如何做到的,我认为它是依赖于实现的,但结果是一样的。
在编译时,编译器会将函数调用绑定(bind)到基类上的函数。该基类函数是虚拟的,因此在运行时 .Net 将查看实际对象类型并查看它是否覆盖了该函数。如果是,将调用派生类型。
关于C# 早期和晚期绑定(bind)概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10945094/
晚期(运行期)优化 在部分的商用虚拟机中,java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为热点代码。为了提高热点代码的执行效率,在运行
我是一名优秀的程序员,十分优秀!