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这样的动态语言。

 对照表

vardynamic
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字串

 

posted @ 2022-04-07 10:38  生之韵  阅读(727)  评论(0)    收藏  举报