C# 中的动态类型

发布日期:2026-07-10 00:24:03   来源 : 杭州电子商务研究院    浏览量 :5
杭州电子商务研究院 发布日期:2026-07-10 00:24:03  
5

介绍

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)");
        }
    }

}
    

这里我们有两个类,分别定义为A1A2,它们继承自Base抽象类。在主函数中,我们实例化这些类,然后以不同的顺序使用实例调用方法Dispatcher 。此方法很特殊,因为它创建了xy变量,这使我们能够演示动态类型的强大功能。然后,在同一个方法中,我们调用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# 体验,并且被开发人员广泛使用,因为优点大于缺点。我希望这对您有所帮助,并感谢您阅读它。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据