将对象分配给特定类型的对象变量后,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();
}
}
编译时错误:
prog.cs(34, 5): error CS1061: Type `Geeks’ does not contain a definition for `mymethod’ and no extension method `mymethod’ of type `Geeks’ could be found. Are you missing an assembly reference?
prog.cs(5, 7): (Location of the symbol related to previous error)
说明:在上面的示例中,我们有一个名为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