C#一文帮你彻底弄懂dynamic和object区别

无意中在官网看到这篇说明,觉得非常准确,权威,恍然大悟的感觉,特意敲了一遍代码,

先说结论: 

dynamic 类型与 object 的不同之处在于,编译器不会对包含类型 dynamic 的表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,之后这些信息会用于在运行时评估操作。 在此过程中,dynamic 类型的变量会编译为 object 类型的变量。 因此,dynamic 类型只在编译时存在,在运行时则不存在。

如何证明这件事如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DynamicAndObject
{
    class Program
    {
        static void Main(string[] args)
        {
            //Demo1();

            ExampleDemo ed = new ExampleDemo();
            //编译即报错,提示没有两个参数的方法
            //ed.TestMethod(2,10);
            dynamic ded = new ExampleDemo();
            //这里编译通过,但运行会报错
            ded.TestMethod(2, 10);
        }

        public static void Demo1() {
            dynamic dyn = 1, dyn2 = 1;
            object obj = 1;

            System.Console.WriteLine(dyn.GetType());
            System.Console.WriteLine(obj.GetType());

            dyn = dyn + 3;
            dyn2 = dyn2 + "3";
            //obj = obj + 3;
            //报错,非常明显看出obj会在编译时,便进行检查
            Console.WriteLine(dyn);
            Console.WriteLine(dyn2);
            /*
              input:
              System.Int32
              System.Int32
              4
              13
              请按任意键继续. . .

            非常清晰看出,dynamic变量的方便灵活之处,
         */
        }

       class ExampleDemo
        { 
            public static dynamic field;
            public dynamic MyProperty { get; set; }

            public dynamic TestMethod(dynamic d) {
                dynamic var1 = "flag1";
                int var2 = 2;
                if (d is int)
                {
                    return var2;
                }
                else {
                    return var1;
                }
            }
       
        }
    }
}

再次也说明,编译器会开启类型检查,方法参数是否一致检查。

参考出处:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/reference-types#the-delegate-type

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,`object`是一个通用的类型,可以表示任何类型的对象。它是所有C#类型的基类,因此可以用来存储任意类型的值。 `JObject`是Newtonsoft.Json库(也称为Json.NET)中的一个类,用于操作和处理JSON数据。它提供了一种方便的方式来解析、创建和修改JSON数据。 以下是`object`和`JObject`的一些区别和用法: 1. 类型:`object`是C#中的通用类型,可以表示任何类型的对象。`JObject`是Json.NET库中定义的特定类型,用于处理JSON数据。 2. 功能:`object`提供了基本的对象操作和转换,但在处理具体数据结构时可能需要进行类型转换和验证。`JObject`提供了更丰富的功能,如解析JSON字符串、访问和修改JSON属性、查询数据等。 3. JSON处理:使用`object`处理JSON数据需要手动进行反序列化和序列化操作,而`JObject`提供了高级的JSON处理功能,可以直接解析JSON字符串并提供更方便的访问和修改方法。 以下是使用示例: ```csharp // 使用object处理JSON string jsonString = "{\"name\":\"John\", \"age\":30}"; object json = JsonConvert.DeserializeObject(jsonString); string name = ((dynamic)json).name; // 使用JObject处理JSON string jsonString = "{\"name\":\"John\", \"age\":30}"; JObject jObject = JObject.Parse(jsonString); string name = (string)jObject["name"]; ``` 在上面的示例中,我们首先使用`JsonConvert.DeserializeObject`方法将JSON字符串反序列化为`object`。然后,我们使用动态类型来访问`name`属性。 使用`JObject.Parse`方法将JSON字符串解析为`JObject`。然后,我们可以通过索引器来访问`name`属性。 需要注意的是,`JObject`提供了更多高级功能,如LINQ查询、动态属性访问等。你可以根据需要选择使用`object`还是`JObject`来处理JSON数据。 希望这能助到你!如果你有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值