📜  C#中的早期和晚期绑定

📅  最后修改于: 2021-05-29 23:42:13             🧑  作者: Mango

将对象分配给特定类型的对象变量后,C#编译器将在.NET Framework的帮助下执行绑定。 C#执行两种不同类型的绑定,它们是:

  • 早期绑定或静态绑定
  • 后期绑定或动态绑定

早期绑定

它在编译期间识别并检查方法或属性。在此绑定中,编译器已经知道它是哪种对象,以及它拥有的方法或属性是什么,这里的对象是静态对象。早期绑定的性能很快,并且易于编码。它减少了运行时错误的数量。

例子:

// C# program to illustrate the
// concept of early binding
using System;
  
class Geeks {
  
    // data members
    public string name;
    public string subject;
  
    // public method
    public void details(string name, string subject)
    {
        this.name = name;
        this.subject = subject;
        Console.WriteLine("Myself: " + name);
        Console.WriteLine("My Favorite Subject is: " + subject);
    }
}
  
// Driver class
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // creating object of Geeks class
        Geeks g = new Geeks();
  
        // Calling the method of Geeks class
        g.details("Ankita", "C#");
  
        // Calling "mymethod()" gives error
        // because this method does not 
        // belong to class Geeks or compiler 
        // does not know mymethod() at compile time
        g.mymethod();
    }
}

编译时错误:

说明:在上面的示例中,我们有一个名为Geeks的类。此类包含details()方法。在这里,编译器已经知道Geeks中存在的属性和方法。但是,当我们尝试调用mymethod()时,它将抛出错误,因为编译器不知道此方法。

后期装订

在后期绑定中,编译器不知道它是什么样的对象以及它拥有的方法或属性是什么,这里的对象是动态对象。对象的类型取决于运行时位于右侧的数据。基本上,后期绑定是通过使用虚拟方法实现的。后期绑定的性能比早期绑定要慢,因为它需要在运行时进行查找。

示例:在下面的程序中, obj保存整数类型数据,而obj1保存双精度类型数据。但是编译器不会在编译时解决这些问题。在运行时,将检测到这些动态对象并将其分别System.Int32 System.Double这就是为什么将运行时解析过程称为后期绑定。

// C# program to illustrate the
// concept of late binding
using System;
  
class GFG {
    static void Main()
    {
        // Dynamic objects
        dynamic obj = 4;
        dynamic obj1 = 5.678;
  
        // Display the type of objects
        Console.WriteLine("The type of the objects are :");
  
        // GetType() method is 
        // used to get the type
        Console.WriteLine(obj.GetType());
        Console.WriteLine(obj1.GetType());
    }
}

输出 :

The type of the objects are :
System.Int32
System.Double