C# 中的动态类型
介绍
2009 年秋季,微软发布了 C# 4.0 版,其中包含多项新功能,例如命名和可选参数、动态类型、变体和 COM 互操作性。所有这些功能都为开发人员提供了以更优雅、更复杂的方式解决问题的新方法。本指南将向您介绍动态类型并教您如何使用这一强大的功能。
如果您已经熟悉 Python 编程语言,那么动态类型可能对您来说非常熟悉。这种类型是静态类型,但动态类型的对象允许您绕过编译时发生的静态类型检查,并在运行时将类型分配给变量。与其他所有事物一样,它也有其优缺点。动态类型与Reflection非常相似,后者也在运行时进行评估,但对性能的影响更大。
多重调度
当您使用面向对象编程 (OOP) 进行开发时,会根据传递给某个成员函数的对象的运行时类型在运行时调用虚拟方法或抽象方法的特定实现。双重分派是这种情况的一个特例,即当您有两个同名方法,但根据参数类型,它们的行为有所不同。
我们来看一个例子。
using System;
namespace Pluralsight
{
public abstract class Base { }
public class A1 : Base { }
public class A2 : Base { }
public class Test
{
public static void Main(string[] args)
{
Base a1 = new A1();
Base a2 = new A2();
Dispatcher(a1, a2);
Dispatcher(a2, a1);
System.Console.ReadKey();
}
public static void Dispatcher(Base a1, Base a2)
{
dynamic x = a1;
dynamic y = a2;
Method(x, y);
}
public static void Method(A1 a1, A2 a2) //1
{
Console.WriteLine("(A1,A2)");
}
public static void Method(A2 a2, A1 a1) //1
{
Console.WriteLine("(A2,A1)");
}
}
}
这里我们有两个类,分别定义为A1和A2,它们继承自Base抽象类。在主函数中,我们实例化这些类,然后以不同的顺序使用实例调用方法Dispatcher 。此方法很特殊,因为它创建了x和y变量,这使我们能够演示动态类型的强大功能。然后,在同一个方法中,我们调用Method,它将根据参数的不同而表现不同。第一个Dispatcher(a1, a2);调用将返回(A1,A2)作为传递参数的顺序,并与Method的//1定义匹配。第二个调用Dispatcher(a2, a1);将返回(A2,A1) ,因为这是与Method的//2定义匹配的顺序。这可能有许多用例,并且与实现switch构造非常相似。
平方根
此示例是关于我们要用来计算特定数字的平方根的一个小函数。Math.sqrt()函数需要一个float类型的变量,这时动态类型就可以派上用场了。
我们来看另一个例子。
using System;
namespace Pluralsight
{
public class Test
{
public static void Main(string[] args)
{
decimal foo = 10;
double sroot = Math.Sqrt(foo);
System.Console.WriteLine($"The square root of {foo} is {sroot}!");
System.Console.ReadKey();
}
}
}
这将编译失败,因为编译时类型检查标识出decimal类型不能转换为double。 但是,如果我们将decimal foo = 10;替换为dynamic foo = 10; ,编译时错误就会消失,并产生以下结果。
The square root of 10 is 3.16227766016838!
结论
动态类型允许更快的开发,但会牺牲一些速度,而静态类型允许更快、更可靠的代码,并且易于查找错误和问题。总而言之,这是一个非常酷的功能,它完全改善了 C# 体验,并且被开发人员广泛使用,因为优点大于缺点。我希望这对您有所帮助,并感谢您阅读它。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~