9_dynamic动态类型与object类型的区别

C# 中 dynamic 动态类型与 object 类型的区别

1. object 类型

  • object 类型是 .NET 中 System.Object 类的别名。
  • 在 C# 中,所有类型(预定义、用户定义、引用类型、值类型)都直接或间接继承自 Object
  • 因此,我们可以将任何类型的值用 object 对象来接收。

2. dynamic 动态类型

  • 动态类型在编译时会绕过类型检查,从而在运行时解析。
  • 因此,动态类型只存在于编译时,不存在于运行时。

3. 两者的区别

区别 object 类型 dynamic 动态类型
类型检查 编译时进行类型检查 运行时进行类型检查
性能 性能较高 性能较低
使用场景 通用类型转换 延迟类型检查、动态语言互操作

object 类型示例

public class Person
{
    public string Name { get; set; } = "Alice";
}

public class Program
{
    public static void Main(string[] args)
    {
        object obj = new Person();

        // ❎ 因为在编译时进行类型检查,所以无法直接访问Name属性 
        // System.Console.WriteLine(obj.Name);         

        // ✅ 类型转换之后,可以访问Name属性
        Person person = obj as Person;
        if (person != null)
        {
            Console.WriteLine(person.Name); 
        }
    }
}

dynamic 动态类型示例

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("动物叫声");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("汪汪");
    }
}

public class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("喵喵");
    }
}


public class Program
{
    public static void Main(string[] args)
    {
        dynamic animal = new Dog();

        // 不需要转换,可以直接调用 dynamic 变量的成员
        animal.Speak(); // 输出:汪汪

        Dog dog = animal as Dog;
        if (dog != null)
        {
            Console.WriteLine(dog.GetType().Name); 
        }

        
    }

}

总结:

  • object 类型是一种通用类型,可以用于存储任何类型的值。
  • dynamic 动态类型是一种延迟类型检查的类型,可以在运行时根据实际情况进行类型转换。
  • 两者各有优劣,应根据具体需求选择使用哪种类型。

此外,还有一些需要注意的地方:

  • 使用 dynamic 动态类型可能会导致性能下降,因为需要在运行时进行类型检查。
  • 在使用 dynamic 动态类型时,应注意类型安全问题,避免出现空引用异常等错误。

建议:

  • 在需要通用类型转换时,使用 object 类型。
  • 在需要延迟类型检查或动态语言互操作时,使用 dynamic 动态类型。
  • 在使用 dynamic 动态类型时,应注意性能和类型安全问题。
posted @ 2024-03-03 23:04  甜饼怪2030  阅读(219)  评论(0)    收藏  举报