var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.ComponentModel;
namespace var_dynamic
{
class Program
{
//var stradsa = "asdasdas"; //报错
static void Main(string[] args)
{
#region var 接收一种类型后 在接受其他类型会报错 编译时解析 编译器会在编译过程中帮我们创建一个具有相关属性和方法的类型。 类型由赋于的值来决定
//还有一点 var 仅能声明方法内的局部变量(只能存在方法体里面 外面就报错)
";
Console.WriteLine(a123);
//a123 = 456; //报错 错误 1 无法将类型“int”隐式转换为“string”
//var 声明的变量在被赋值后类型即确定下了,后续程序中不能在赋其他类型的值
var xwyy = new object();//没有意义 不要写这样的代码
#endregion
#region 匿名类型集合 通过反射读取object 对应的属性名
//var xss = new { name = "a", Id = 1 };
//var list = (new int[] { 1 }).Select(x => new { Name = "张三", Num = 123 }).ToList();
var listss = new List<object>();
listss.Add(" });
listss.Add(" });
bool ishave = false;
foreach (var item in listss)
{
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(item);
PropertyDescriptor pdID = pdc.Find("Address", true);
var x = pdID.GetValue(item);
Console.WriteLine("xxxx " + x);
PropertyDescriptor pdName = pdc.Find("Tel", true);
var z = pdName.GetValue(item);
Console.WriteLine("zzzz " + z);
//if (x.ToString() == x && z.ToString() == z)
//{
// ishave = true;
// break;
//}
}
#endregion
#region dynamic 接收一种类型后 接受其他类型不会报错 运行时解析
//随用随定义,用完就消失
";
Console.WriteLine(b123);
b123 = ;
Console.WriteLine(b123);
b123 = " };
Console.WriteLine(b123.Id);
#endregion
#region object 接收任意类型 但取值 要转换为 对应类型 object对象无法 解析 定义成员
";
c123 = ;
c123 = " };
//Console.WriteLine(c123.name); //报错 错误 1 “object”不包含“name”的定义,并且找不到可接受类型为“object”的第一个参数的扩展方法“name”(是否缺少 using 指令或程序集引用?)
//从object 取出 Id name 就要用 dynamic
dynamic dyc123 = c123;
Console.WriteLine(dyc123.name);
#endregion
#region var 可以解析 详情 可看 .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
// 反编译为 泛型类 类似 <>f__AnonymousType0<<ID>j__TPar, <Name>j__TPar, <Age>j__TPar>
// 属性只读 重写了3个基类方法 Equals GetHashCode Tostring
//匿名类共享 符合一定条件则可以共享一个泛型类
//属性类型和顺序都一致,那么默认共享前一个泛型类
//属性名称和顺序一致,但属性类型不同,那么还是共同使用一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的对象:
//数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类
var annoyCla1 = new
{
ID = ,
Name = "EdisonChou",
Age =
};
Console.WriteLine(annoyCla1.Name);
#endregion
#region dynamic 可读可写
dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写
expando.Id = ;
expando.Name = "Test";
string json = JsonConvert.SerializeObject(expando); //输出{Id:1,Name:'Test'}
#endregion
#region 动态添加字段
Console.WriteLine("动态添加字段");
List<string> fieldList = new List<string>() { "Name", "Age", "Sex" }; //From config or db
dynamic dobj = new System.Dynamic.ExpandoObject();
var dic = (IDictionary<string, object>)dobj;
foreach (var fieldItem in fieldList)
{
dic[fieldItem] = "set " + fieldItem + " value"; /*实现类似js里的 动态添加属性的功能
var obj={};
var field="Id";
eval("obj."+field+"=1");
alert(obj.Id); //1 */
}
var val = dobj.Name; //“set Name value”
var val1 = dobj.Age;//”set Age value“
#endregion
#region 枚举该对象所有成员
Console.WriteLine("枚举该对象所有成员");
foreach (var fieldItem in (IDictionary<String, Object>)dobj)
{
var v = (fieldItem.Key + ": " + fieldItem.Value);
Console.WriteLine(v);
}
#endregion
#region 匿名类
Console.WriteLine("匿名类");
//var aaaa = new {Id=1,Name="Test"}; //匿名类字段只读不可写
// 切记 就算 用运行解析装起来 也不行 还是表示 匿名类型
, Name = "Test" }; //匿名类字段只读不可写
//aaaa.Id = 2; //不可写 报错无法为属性或索引器“<>f__AnonymousType1<int>.Id”赋值 - 它是只读的
dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject("{Name:'aa',Sex:'Male',Age:11}");
var name = obj.Name.Value; //aa
Console.WriteLine(name);
#endregion
#region 返回一个匿名对象 方法返回值 类型无法确定 方法返回的对象不确定怎么办 返回object ? 返回dynamic
var xs1 = GetObject();
//xs1.Name; //object点不出来 要用反射
//此时方法不会出现语法错误,程序可以成功编译并执行
//dynamic 表示动态类型,动态类型的含义就是 程序编写、编译阶段 类型不确定,在Runtime时再通过反射机制确定相关对象的属性或方法。因此编写阶段 不会进行语法检测。
//dynamic 可用来声明 字段、属性、方法参数、方法返回值
//dynamic 不支持智能提示,因为你写代码时 dynamic 是什么没法知晓(反射)
//dynamic 声明的变量,可理解为 object 类型变量。所以给dynamic变量赋任何类型值都正确,但在使用变量来取得某个属性值或调用某方法时(此时程序肯定处于Runtime状态),CLR会检查(反射)所调用的属性或方法是否存在,不存在报运行时异常。
//dynamic在 Asp.net Mvc web开发中处处使用,虽然看上去很复杂,本质就上面所说内容。
// var dynamic
// 声明字段 × √
// 局部变量 √ √
// 方法参数类型 × √
// 方法返回值类型 × √
Console.WriteLine(xs1.Name); // dynamic 就很方便
#endregion
#region var关键字 静态类型语言也被称为强类型语言 就是在编译过程中执行类型检查的语言
//间接 定义数据类型的方式
string str001 = "Test";// 这种写法被称为显式类型的声明,也被称为直接声明。
var str = "Test";//这被称为隐式类型声明或间接类型声明。
//编译器会在编译过程中验证数据,并在编译过程中创建适当的类型。在此实例中,编译器将检查Test,并在生成IL代码时将var关键字替换为字符串类型。
//var关键字在编译时静态的定义数据类型,而不是在运行时,即:一旦定义了数据类型,它将不会在运行时更改。
var str002 = "Test";
//str002 = 123; //编译错误 隐式转换抛出编译错误
//对于像int、double、string等简单数据类型,我们最好使用特定的数据类型来声明变量,以免让事情变得复杂。但当你创建了一个很大的类,那么为了方便创建对象,你最好使用var关键字。还有一种约定俗成的习惯,当我们使用LINQ或Anonymous类型时,一般使用var关键字。
#endregion
#region 动态类型语言 运行时执行类型检查的语言。如果您不知道您将获得或需要分配的值的类型,则在此情况下,类型是在运行时定义的
dynamic str0002 = "Test";
//在为 str0002 分配值之后,如果执行一些数学运算,它不会给出任何错误信息。
str0002++; // 编译通过 生成也成功 但是,如果你运行这个应用程序,对不起,VS会给你如下所示的运行时错误:
//dynamic关键字内部使用反射,感兴趣的童鞋可以自行研究一下。
// var和dynamic关键字之间的主要区别在于绑定时间不一样:var是早期绑定,dynamic绑定则会在运行时进行。
//var实际上是编译器抛给我们的语法糖,一旦被编译,编译器就会自动匹配var变量的实际类型,并用实际类型来替换该变量的声明,等同于我们在编码时使用了实际类型声明。而dynamic被编译后是一个Object类型,编译器编译时不会对dynamic进行类型检查。
//.Net 4.0之前的运行时的动态调用一般是通过反射来实现,但是反射的代码的可读性不高。.Net 4.0之后使用dynamic就好得多,因为dynamic是一种静态类型,完全可以像其它类型一样的声明和调用,而不用写反射相关的代码。
//合理的运用dynamic可以让你的代码更加的简洁,而且比直接使用反射性能更好(反射没有优化处理的前提),因为dynamic是基于DLR,第一次运行后会缓存起来。其实有心的同学会发现.net的类库里面很多地方都用了dynamic这个东西,例如:mvc中的ViewBag就是一个很好的例子。一般情况下,如果开发者不知道方法和方法的返回类型是否公开,请使用dynamic关键字。
//补充:C# var和dynamic的用法和理解
//var和dynamic的本质区别是类型判断的时间不同,前者是编译时,后者是运行时。
//1.var在声明变量方面简化语法(只能是局部变量),在编译时交给编译器推断。
//2.dynamic也是为简化语法而生的,它的类型推断是交给系统来执行的(运行时推断类型)。
//3.var不能用于字段、参数等,而dynamic则可以。
//4.var在初始化的时候就确定了类型。
//5.dynamic可以用于方法字段、参数、返回值以及泛型参数,把动态发挥的淋漓尽致。
//6.dynamic在反射方面做的可以,只是我自己没有尝试过。
//7.var是C# 3.0的产物,dynamic是C# 4.0的产物。
//最后还得关心一下效率问题:
// 越底层的效率越高
//可以说是 传统强类型 >= var > dynamic,所以用dynamic的时候还得考虑性能和效率!
#endregion
Func<;
//var hui2 = () => 5; //错误 1 无法将“lambda 表达式”赋予隐式类型的局部变量
// var 不是一个匿名函数,同时初始化表达式也不能是 null;
}
//private static object GetObject()
//private static var GetObject() 不支持 报错
private static dynamic GetObject()
{
, Like = "LOL" };
}
}
}
var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo的更多相关文章
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- dynamic动态类型的扩展方法
对于一个动态类型来说,你可以认为它包含任意成员,它们都能通过编译.但到了运行时,到底是否拥有这些成员,就真相大白了.如 dynamic test = ; Console.Write(test.Name ...
- 【.net深呼吸】动态类型(娱乐篇)
有朋友跟老周说,动态类型是干吗的,他不太熟悉,希望老周可以讲一讲.没事,这事情老周也比较TMD乐意做的,因为老周写的这些烂文本来就是为了普及基础知识的,坚定不移地为社会基础教育而服务. 首先,咱们要知 ...
- .net动态类型在处理json数据方面的应用
我们在.net中处理json数据时,经常需要定义相应的类.比如json数据:{ "name" : "hello", "age" : 18 } ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- 面向对象的JavaScript --- 动态类型语言
面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
本文是要写的下篇<C#反射及优化用法>的前奏,不能算是下一篇文章的基础的基础吧,有兴趣的朋友可以关注一下. 随着C#的发展,该语音内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑. ...
- C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic
例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...
- 使用动态类型dynamic让你的省了很多临时类
客户端与服务端的数据交互使用的数据格式是json格式,为了使客户端与服务端有类对应关系,进行序列化,所以总要定义一些类,使用动态类型dynamic可以不必要定义那么多类. 测试代码: using Sy ...
随机推荐
- 日常:论我的T3是如何苟掉的
说起来都是泪啊 T3的bfs一直不对,我想死. 考试时候苟了两个小时,死活找不到错误(因为lca和离散化都码出来了,太乱) 最后把bfs单独提出来,发现在bfs里面输出的f[ly][0]都是正确的,到 ...
- docker guide
centos docker community version install: yum -y install docker # install docker systemctl start dock ...
- python数组中数据位置交换 -- IndexError: list assignment index out of range
代码: t = [-10,-3,-100,-1000,-239,1] # 交换 -10和1的位置 t[5], t[t[5]-1] = t[t[5]-1], t[5] 报错: IndexError: l ...
- JavaScript设计模式基础之面向对象的JavaScript(二)
多态 多态的实际含义:同一操作作用与不同的对象上面,可以产生不同的解释和不同的执行结果,就是说,给不同的对象发送同一个消息 的时候,这些对象会根据这个消息分别给出不同的反馈 代码如下: class D ...
- luogu 数列找不同-莫队
https://www.luogu.org/problemnew/show/P3901 了解过莫队的人应该都清楚,莫队是一个优化的暴力,可以在相对暴力比较优的时间中,求出一段序列内的某些性质(例:数字 ...
- 关于web页面优化
简单汇总了一下web的优化方案(主要的前端优化策略) 减少http请求次数 文件合并(js.css.图片):ps:多个图片合并之后,总体积会变小 内联图片,即data:URL scheme,但容易导致 ...
- 如何用纯 CSS 创作一种文字断开的交互特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/LmjNgL 可交互视频教程 此视 ...
- spring-mvc junit测试
import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; impor ...
- spring的IOC底层原理
我们调用一个类的方法,首先是User user=new User(),对象调用这个方法,user.add(),这种方法有一个缺陷就是代码的耦合度太高,比如你的servlet调用User类里的方法,需 ...
- Python变量及数据类型
所有编程语言几乎都会有 ’ 变量‘ ,如 a = 2,用一个a变量指代数字2,在Python中,一切皆对象,因此在变量赋值的时候实际上是在内存中开辟了一块存储变量内容的内存空间对象. 对象可以指定不同 ...