📜  C#中的动态类型

📅  最后修改于: 2021-05-29 19:34:30             🧑  作者: Mango

在C#4.0中,引入了一种称为动态类型的新类型。它用于避免编译时类型检查。编译器不会在编译时检查动态类型变量的类型,而是在运行时检查动态类型变量的类型。动态类型变量是使用dynamic关键字创建的。

例子:

dynamic value = 123;

重要事项:

  • 在大多数情况下,动态类型的行为类似于对象类型。
  • 您可以使用GetType()方法在运行时获取动态变量的实际类型。动态类型会在运行时根据右侧显示的值更改其类型。如下例所示。

    例子:

    // C# program to illustrate how to get the
    // actual type of the dynamic type variable
    using System;
      
    class GFG {
      
        // Main Method
        static public void Main()
        {
      
            // Dynamic variables
            dynamic value1 = "GeeksforGeeks";
            dynamic value2 = 123234;
            dynamic value3 = 2132.55;
            dynamic value4 = false;
      
            // Get the actual type of 
            // dynamic variables
            // Using GetType() method
            Console.WriteLine("Get the actual type of value1: {0}",
                                      value1.GetType().ToString());
      
            Console.WriteLine("Get the actual type of value2: {0}",
                                      value2.GetType().ToString());
      
            Console.WriteLine("Get the actual type of value3: {0}",
                                      value3.GetType().ToString());
      
            Console.WriteLine("Get the actual type of value4: {0}", 
                                      value4.GetType().ToString());
        }
    }
    

    输出:

    Get the actual type of value1: System.String
    Get the actual type of value2: System.Int32
    Get the actual type of value3: System.Double
    Get the actual type of value4: System.Boolean
    
  • 当您将类对象分配给动态类型时,编译器将不会检查保存自定义类对象的动态类型的正确方法和属性名称。
  • 您还可以在方法中传递动态类型参数,以便该方法在运行时可以接受任何类型的参数。如下例所示。

    例子:

    // C# program to illustrate how to pass
    // dynamic type parameters in the method
    using System;
      
    class GFG {
      
        // Method which contains dynamic parameters
        public static void addstr(dynamic s1, dynamic s2)
        {
            Console.WriteLine(s1 + s2);
        }
      
        // Main method
        static public void Main()
        {
      
            // Calling addstr method
            addstr("G", "G");
            addstr("Geeks", "forGeeks");
            addstr("Cat", "Dog");
            addstr("Hello", 1232);
            addstr(12, 30);
        }
    }
    

    输出:

    GG
    GeeksforGeeks
    CatDog
    Hello1232
    42
    
  • 如果方法和属性不兼容,则编译器将在运行时引发异常。
  • 它不支持Visual Studio中的智能感知。
  • 如果没有动态类型的类型检查,则编译器在编译时不会在动态类型上引发错误。