猿教程 Logo

C# 动态类型

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

C#4.0(.NET 4.5)引入了一种新类型,避免了编译时类型检查。 上一节中您已经了解了隐式类型变量var,其中编译器基于表达式的值分配特定类型。 动态类型在编译时不做类型检查; 相反,它在运行时解析类型。

可以使用dynamic关键字定义动态类型。

相关实例:

dynamic dynamicVariable = 1;

在大多数情况下,编译器将动态类型编译为对象类型。 上述语句将编译为:

相关实例:

object dynamicVariable = 1;

动态的实际类型将在运行时解析。 您可以检查动态变量的类型,如下所示:

相关实例:

static void Main(string[] args)
{
    dynamic dynamicVariable = 1;

    Console.WriteLine(dynamicVariable.GetType().ToString());
}

运行结果:

System.Int32

动态类型在运行时根据“=”运算符右侧的表达式的值更改其类型。 以下示例显示动态变量如何根据其值更改其类型:

相关实例:

static void Main(string[] args)
{
    dynamic dynamicVariable = 100;
    Console.WriteLine("Dynamic variable value: {0}, Type: {1}",dynamicVariable, dynamicVariable.GetType().ToString());

    dynamicVariable = "Hello World!!";
    Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());

    dynamicVariable = true;
    Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());

    dynamicVariable = DateTime.Now;
    Console.WriteLine("Dynamic variable value: {0}, Type: {1}", dynamicVariable, dynamicVariable.GetType().ToString());
}

运行结果:

Dynamic variable value: 100, Type: System.Int32 
Dynamic variable value: Hello World!!, Type: System.String 
Dynamic variable value: True, Type: System.Boolean 
Dynamic variable value: 01-01-2014, Type: System.DateTume

动态类型的方法和属性:

如果将类对象分配给动态类型,则编译器不会检查包含自定义类对象的动态类型的正确方法和属性名称。 请考虑以下示例。

相关实例:

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }
    public int StandardID { get; set; }

    public void DisplayStudentDetail()
    {
        Console.WriteLine("Name: {0}", this.StudentName);
        Console.WriteLine("Age: {0}", this.Age);
        Console.WriteLine("Standard: {0}", this.StandardID);
    }
}

class Program
{
    static void Main(string[] args)
    {
        dynamic dynamicStudent = new Student();

        dynamicStudent.FakeMethod();
    }
}

在上面的例子中,我们将Student对象赋给一个动态变量。 在Main()方法的第二个语句中,我们调用FakeMethod()方法,这在Student类中不存在。 然而,编译器不会给FakeMethod()的任何错误,因为它跳过动态类型的类型检查,而是会得到一个运行时异常,如下所示。



动态类型为方法参数:

方法可以具有动态类型参数,以便它可以在运行时接受任何类型的参数。

相关实例:

class Program
{    
    static void PrintValue(dynamic val)
    {
        Console.WriteLine(val);
    }

    static void Main(string[] args)
    {

        PrintValue("Hello World!!");
        PrintValue(100);
        PrintValue(100.50);
        PrintValue(true);
        PrintValue(DateTime.Now);
    }
}

运行结果:

Hello World!! 
100 
100.50 
True 
01-01-2014 10:10:50
要点
  1. 动态类型在运行时而不是编译时解决。 

  2. 编译器跳过动态类型的类型检查。 所以它不会在编译时给出关于动态类型的任何错误。 

  3. 动态类型在visual studio中没有智能感知支持。 

  4. 方法可以具有动态类型的参数。 

  5. 如果方法或属性不兼容,则在运行时抛出异常。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/csharp-dynamic-type.html