以下C#程序是否使用静态或动态绑定?

时间:2013-03-22 11:09:02

标签: c# dynamic-binding static-binding

我有以下课程:

class Polygon
{
    protected string name;
    protected float width, height;
    public Polygon(string theName, float theWidth, float theHeight)
    {
        name = theName;
        width = theWidth;
        height = theHeight;
    }
    public virtual float calArea()
    {
        return 0;
    }
}

class Rectangle : Polygon
{
    public Rectangle(String name, float width, float height) : base(name,width,height)
    {
    }
    public override float calArea()
    {
        return width * height;
    }
}

主要功能1:

   static void Main(string[] args)
    {
        Rectangle rect1  = new Rectangle("Rect1", 3.0f, 4.0f);
        float Area = rect1.calArea()
    }

主要功能2:

 static void Main(string[] args)
    {
        Polygon poly = new Rectangle("Rect1", 3.0f, 4.0f);
        float Area = poly.calArea()
    }

据我所知,主功能2使用动态绑定 如果我在Rectangle类的calArea方法中将override关键字更改为new,那么它是静态绑定。 主要功能1怎么样?它是否使用静态/动态绑定?

2 个答案:

答案 0 :(得分:1)

我不认为'动态'绑定对此是正确的。您正在谈论编译时(静态)和运行时绑定。如果没有从Rectangle继承类 - 那么在示例1中,有足够的信息供编译器决定调用哪个方法,并且它可以进行编译时(静态)绑定。

<强> [编辑]:

显然我不对。 我检查了示例1生成的IL代码,示例2使用'new'代替'override',主函数的代码看起来是相同的:

  IL_000f:  newobj     instance void Console.Program/Rectangle::.ctor(string,
                                                                          float32,
                                                                          float32)
  IL_0014:  stloc.0
  IL_0015:  ldloc.0
  IL_0016:  callvirt   instance float32 Console.Program/Polygon::calArea()

从这段代码中我们可以看到,即使是例1,也可以从Polygon类调用callArea方法。因此,在编译IL代码的阶段,没有绑定到精确的方法实现。

答案 1 :(得分:0)

非虚方法是静态绑定,这意味着它在编译时已知要调用哪个方法。通过提供新关键字,您告诉编译器这是虚拟/覆盖区域。

主要功能1没有定义新关键字,AFAIK将使用动态绑定,因为它仍然在虚拟覆盖的范围内。