Dynamic和Var的区别以及dynamic的使用详解

 2024-02-12 04:01:39  阅读 0

C#中很多关键字的用法很容易混淆,var和就是其中之一。 它们都可以声明动态类型变量,但本质上它们还是有很多区别。 var的类型在编译阶段就已经确定了。 初始化时必须提供初始化值,但也可以不提供。 类型是在运行时确定的。

1、var声明局部变量只是一种简化的语法,需要编译器根据表达式推断出具体的数据类型。

2.Var只能用于在方法内部声明局部变量,但可以用于局部变量、字段和参数。

3.表达式不能转换为var,但可以转换为.

4.用var声明的变量必须显式初始化,但用dynam声明的变量不需要初始化。

//var 在编译阶段已经确定类型
// var varError;
var isIntType = ;
isIntType.ToString();
//dynamic在编译期间不进行任何
//的类型检查,而是将类型检查放到
//了运行期
dynamic dyn = ;
// dynamic dynOk;
dyn = "hello world";
//error 字符串没有 [ fn不存在的方法 ] 的方法
//但在语法检查时通过,不会提示语法错误
var s = dyn.fn不存在的方法();//runtime error 

由于类型是在运行时检查的,因此有时会发生错误,因此您必须明智地使用它。 那么什么时候使用比较方便呢? 我们首先定义一个类,然后使用反射动态调用Talk方法:

class Person
{
public void Talk(string msg)
{
MessageBox.Show(msg);
}
} 

//dynamic 在反射时候可以简化代码
System.Type t = typeof(Person);
var obj = Activator.CreateInstance(t, null);
t.InvokeMember("Talk", System.Reflection.BindingFlags.InvokeMethod, null, obj, new object[] { "hell world!" }); 

在反射时,传统的方法调用往往很麻烦,但使用它们却非常简单和直观:

dynamic obj = Activator.CreateInstance(t, null);
obj.Talk("hell world!");

因此,只要正确使用,它仍然是C#的一个非常好的特性。

最后我想总结以下几点:

人们经常将关键字 var 与 var 进行比较。 事实上,var和var是两个完全不同的概念,根本不应该放在一起比较。 Var实际上是编译时扔给我们的“语法糖”。 一旦编译完成,编译时会自动匹配var变量的实际类型,并将变量的声明替换为实际类型。 这看起来就像我们在编码时使用实际类型来声明的。 编译后,它实际上是一个类型,但编译器会对类型进行特殊处理,使其在编译时不进行任何类型检查,而是将类型检查放在运行时。

这可以从编辑器窗口中看到。 用 var 声明的变量支持“智能感知”,因为可以推断出 var 类型的实际类型,但用 var 声明的变量不支持“智能感知”,因为编译器对其运行时类型一无所知。 对变量使用 会提示“此操作将在运行时解析”。

标签: 变量 类型 实际

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码