11、vs2022_匿名类型var及dynamic
一、匿名类型var
格式: var 名字=new {字段赋值};
c#中只是作为推断,根据赋值推断出类型,隐式类型 var。
隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。
1)var类型的值必须是局部变量或静态变量
2)var变量在声明之前必须被初始化
3)变量的值不能为null(这样编译器就不能判断类型了)
4)var变量不能为一个方法或方法组
5)不能用来声明参数类型
二、使用
1、声明匿名类型
//声明匿名类型 var product = new { name = "apple", price = 5000 }; Console.WriteLine(product); //显示{ name = apple, price = 5000 } Console.WriteLine(product.name); //显示apple
2、声明包含匿名类型的匿名类型
//包含匿名类型的匿名类型 var product = new { name = "apple", price = 5000, detail = new { color = "red", date = "2022-10-01", } }; //显示{ name = apple, price = 5000, detail = { color = red, date = 2022-10-01 } } Console.WriteLine(product); Console.WriteLine(product.detail.color); //显示red
ps:不使用匿名类型,示例如下
Product product = new Product(); product.Name = "Apple"; product.ExpiryDate = new DateTime(2008, 12, 28); product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; string output = JsonConvert.SerializeObject(product); Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output); Console.WriteLine(product); class Product { public string Name { get; set; } public DateTime ExpiryDate { get; set; } public decimal Price { get; set; } public string[] Sizes { get; set; } };
3、声明匿名类型的数组
//声明匿名类型数组 var products = new[] { new { id = 1, name = "apple", price = 5000 }, new { id = 2, name = "huawei", price = 7000 }, new { id = 3, name = "xiaomi", price = 3000 }, }; foreach (var p in products) Console.WriteLine(p);
4、声明匿名类解析JSON数据
//声明匿名类解析JSON数据(引用Newtonsoft.Json) string json = " { \"name\":\"apple\" , \"price\":5000 ,\"address\":\"china\"}"; var jsonObj = JsonConvert.DeserializeAnonymousType(json, new { name = string.Empty, price = 0 }); Console.WriteLine($"name is {jsonObj.name},price is {jsonObj.price}");
又如,当一个json格式的字符串需要反序列化,又不知道它对应的类型,可以匿名序列化
//声明一个匿名对象,并初始化 var definition = new { name = "" }; //使用匿名序列化函数 string json1 = @"{'name':'apple'}"; var pro = JsonConvert.DeserializeAnonymousType(json1, definition); Console.WriteLine(pro.name); // apple
5、序列化SerializeObject(),将JSON对象转成JSON字符串
//序列化SerializeObject(),将JSON对象转成JSON字符串。 var product = new { name = "apple", price = 5000 }; string output = JsonConvert.SerializeObject(product); Console.WriteLine(output); //显示{"name":"apple","price":5000}
6、反序列化DeserializeObject(),将一个JSON字符串转换成一个JSON对象
//反序列化DeserializeObject(),将一个JSON字符串转换成一个JSON对象; string json = " { \"name\":\"apple\" , \"price\":5000 }"; Product product = JsonConvert.DeserializeObject<Product>(json); Console.WriteLine(product); //显示对象Product Console.WriteLine(product.name); //显示apple Console.WriteLine(product.price); //显示5000 class Product { public string name { get; set; } public int price { get; set; } }
7、返回集合中的几个属性就可以使用匿名类型。(如果只需要一个属性,不需要匿名类,直接返回该属性值)
List<temp> list = new List<temp>(); list.Add(new temp() { id = 1, name = "apple", price = 5000 }); list.Add(new temp() { id = 2, name = "huawei", price = 7000 }); var res = list.Select(u => new { id = u.id, name = u.name }); foreach (var item in res) { Console.WriteLine($"id is {item.id},name is {item.name}"); } //定义类 class temp { public int id { get; set; } public string name { get; set; } public int price { get; set; } }
三、var与dynamic的区别
var是C# 3.0引入的(基于 .NET 3.5),dynamic是C# 4.0。
var声明的变量都是静态类型,dynamic是动态类型。dynamic的引入是为了支持像ruby,python这样的动态语言。
对照表
| var | dynamic |
|---|---|
| C# 3.0引入 | C# 4.0引入 |
| 静态类型 – 在编译的时候就确定了类型 | 动态类型 – 在运行时才确定变量类型 |
| 需要 在定义时完成初始化。 例如: var str="I am a string"; str这个变量会被编译器当作string类型。 | 不 需要 在定义时初始化。 例如,以下代码没有任何问题: dynamic str; str="I am a string"; str=2; |
| 编译时捕获错误 因为编译器在编译的时候就知道了它的属性,类型和方法。 | 运行时才会捕获错误 因为编译器在运行的时候才知道其属性,类型及方法。 |
| Visual Studio会显示补全提示(intellisense) 因为对于编译器而言,变量的类型是确定的/知道的。 | 没有智能提示 因为只有运行时才能知道其类型,属性及方法。 |
| 例如, var obj1;将 抛出编译错误 因为变量没有被初始化,而编译器在编译时需要根据它的值推断出类型。 | 而 dynamic obj1;则编译成功 |
| 如, var obj1=1;编译没有问题,而再加上下面这句 var obj1=” I am a string”; 就会报错 因为obj1的数据类型已经在第一句赋值时就确定了,也就是System.Int32(数字1所对应的数据类型) 而第二句把string类型的值赋给Int32自然就违反类型安全了。(一般而言,不同类型不能直接赋值) | 又如, dynamic obj1=1;没有问题,再加上dynamic obj1=" I am a string";还是没有问题 因为编译器首先将obj1指定为Int32类型(运行时指定),在第二句调用时又将obj1重新指定为string。代码完美执行,不会报错。 |
form格式是一种“键值对”的数据格式,比如:
a=1&b=2&c=3
而json格式则类似这样:
{"a":1,"b":2,"c":3}
如果传递的数据比较简单,那么两种方式基本上没什么大区别(当然后台接收数据的方式肯定是不同的),但是如果数据比较复杂,比如包含数组、对象等时,就只有json才能胜任了。
此外,如果数据是通过表单提交的,那么当然使用默认的form即可,因为它会自动构建数据结构,无需手工拼接;而如果是通过ajax发送数据,则最好使用json,因为可以通过简单的方法把对象转换为json字串

浙公网安备 33010602011771号