首页 > 其他分享 >9_dynamic动态类型与object类型的区别

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

时间:2024-03-03 23:14:03浏览次数:19  
标签:Console object dynamic 类型 动态 public

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 动态类型时,应注意性能和类型安全问题。

标签:Console,object,dynamic,类型,动态,public
From: https://www.cnblogs.com/cookie2030/p/18050961

相关文章

  • 8_C#如何判断变量类型
    C#中判断变量类型的两种方法1.GetType()方法GetType()方法用于获取当前实例的准确运行时类型。该方法返回一个Type对象,该对象包含有关该类型的信息,例如类型名称、成员、属性等。示例:publicclassPerson{publicstringName{get;set;}}publicclas......
  • 在K8S中,有哪几种控制器类型?
    在Kubernetes(K8s)中,控制器(Controller)是用来确保实际集群状态与所需状态保持一致的关键组件。它们监视并自动调整系统以达到预期状态,以下是Kubernetes中主要的几种控制器类型:ReplicationController(RC):在早期版本的Kubernetes中用于保证指定数量的Pod副本始终运行。后来......
  • MySQL之基本数据类型
    数据类型:类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMT......
  • Redis的常用数据类型与操作
    Redis简介Redis是一个基于内存的key-value结构数据库(内存存储)(键值对)Mysql是将数据,是通过数据文件的方式存放在磁盘上(磁盘存储)(二维表)Redis特点抢购秒杀,或者新闻热点,大量的用户去访问的数据,就适合存放在Redis中,是对mysql的补充,往往项目中是和mysql共存的状态redis进行cmd命令......
  • Halcon HObject和C#的Bitmap图像互转
    转载:https://blog.51cto.com/u_15088375/3247784#:~:text=HalconHObject和C%23的Bitmap图像互转1HalconHObject和C%23的Bitmap图像互转2一,Bitmap转HObject3方法一:HOperatorSet.GenImageInterleaved直接转换4方法二:C%23获取图像各个通道内存首地址和HOperatorSet.GenIma......
  • 各种类型json解析
    usingNewtonsoft.Json;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Web.Script.Serialization;namespaceAnalysisJson{classProgram{staticvoidMain(string[]args......
  • json 的基本类型
    JSON(JavaScriptObjectNotation)主要支持以下6种基本数据类型:字符串(String):由一系列Unicode字符组成的序列,用双引号括起来表示。例如:"Hello,world"。注意,在JSON中不能使用单引号来表示字符串,双引号是特殊字符。数字(Number):可以是整数或浮点数。JSON中没有复数类型或特殊的有理数......
  • Java引用类型解析:掌握强引用、软引用、弱引用和幻象引用的妙用
     概述:Java中的引用分为强引用、软引用、弱引用和幻象引用。强引用是最常见的,不会被垃圾回收;软引用在内存不足时才被回收;弱引用在下一次垃圾回收时回收;幻象引用用于检测对象是否已被回收。它们各自适用于不同场景,帮助开发者更灵活地管理对象生命周期,避免内存泄漏。在Java中,引......
  • python面向对象(Object Oriented Program)
    面向对象(ObjectOrientedProgram)在Python中,所有的数据(包括数字和字符串)实际都是对象,同一类型的对象都有相同的类型。我们可以使用type()函数来获取关于对象的类型信息。什么是类,什么是对象?在Python中,使用类来定义同一种类型的对象。类(class)是广义的数据类型,能够定义复......
  • day 05-2 数据类型(字符串)
    3.字符串字符串,我们平时会用他来表示文本信息。例如:姓名、地址、自我介绍等。3.1定义v1="包治百病"v2='包治百病'v3='"包"治百病'v4="包'治百病'"V5="""吵架都是我的错,因为大家打不过。"""#三个引号,可以支持多行/换行表示一个字符串,其他的都只能在一行中表......