当前位置: 首页 > 知识库问答 >
问题:

基本调用是否在 c# 中动态绑定?

年运珧
2023-03-14

只是出于好奇:C#中使用base关键字的调用是否是动态绑定的(即它是多态调用)?

考虑以下示例:

public class A
{
    public virtual void WriteSomething() 
    { 
        Console.WriteLine("Hello from A"); 
    }
}

public class B : A
{
    public override void WriteSomething() 
    { 
        base.WriteSomething();
        Console.WriteLine("Hello from B");
    }
}

public class Program
{
    public static void Main()
    {
        A instance = new B();
        instance.WriteSomething();
    }
}

我知道当客户端(在本例中为 Main 方法)调用实例时。写东西,这个调用是动态绑定的。但是基地呢。在类 B 中的重写方法中写入某些调用?我假设它不是动态绑定的,因为编译器在编译时知道基类,因此动态绑定不是必需的 - 但我找不到任何文档。

提前感谢您的帮助!

共有1个答案

寇丰
2023-03-14

我刚刚看了一下中间语言,可以看到< code>base调用不是动态绑定的(蓝色矩形):

 类似资料:
  • 为什么编译器让这个表达式编译,而运行时异常是不可避免的? 我认为< code >动态绑定不应该用于void方法 如果C#规范将上述表达式引用为动态绑定表达式,为什么不编译以下方法?

  • 动态绑定确定在运行时而不是在编译时调用的方法。 动态绑定也称为后期绑定。 在Objective-C中,所有方法都在运行时动态解析。执行的确切代码由方法名称(选择器)和接收对象确定。 动态绑定可实现多态性。例如,考虑一组对象,包括和。 每个对象都有自己的方法实现。 在下面的代码片段中,表达式执行的实际代码是在运行时确定的。 运行时系统使用方法运行的选择器来识别的任何类中的适当方法。 下面来看一下解释

  • 下面的代码有4个类:Base1、Derived1(派生自Base1)、Base2、Derived2(派生自Base2)。两个基本类都有整数data1和display_data()函数。这两个派生类都有整数data1和data2,以及display_data()函数。 我在我的代码中尝试了4个案例,可以在主函数中看到。我不知道哪一个是静态绑定,哪一个是动态绑定。我需要一些帮助。我还想知道,这些情况中

  • 关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。

  • 起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。