如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢?

ViewBag.Mode1l=new object();
ViewBag.Model2=new object();
ViewBag.Model3=new object();
......

 我们知道,在使用对象属性的时候要先申明(即这个对象的类中已经定义了这个属性)才能使用(此时VS的自动提示能弹出此类的所有属性),然而使用ViewBag时你会发现 ViewBab. 之后不会弹出任何属性(除非前面已经添加了属性),而且我们可以自己随便写一个属性,却可以正确运行。而这都是归功于dynamic这个属性。

1.在讲dynamic之前,先来回顾一下var这个类型。

  从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。 下面的两个 i 声明在功能上是等效的:

var i = 10; // implicitly typed(隐式申明)
int i = 10; //explicitly typed(显示申明)

var这个类型是通过编译器确定的(即在编译时,编译器会根据这个变量的值或引用的对象类型来决定这个变量的类型),但要注意一旦这个变量的类型确定了之后就不可在更改。

var i = 1;    //i为int型 , 等价于 int i = 1;
i = 1.0;    //报错,1.0为double型

 注意,var型变量在申明时必须初始化,如下:

var i = 1;    //正确
var i; 
i = 1;    //错误

2.var用法举例:

// 允许但不需要使用var,因为可以将查询结果的类型显示的申明为IEnumerable<string>
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
where word[0] == 'g'
select word;
// 因为元素类型为string类型,不是匿名类型,所以var是非必需的
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
//var must be used because the result is a collection of anonymous types, and the name of that type is not accessible except to the compiler itself.">表达式中必须使用 var,因为结果是一个匿名类型集合,而该类型的名称只有编译器本身可以访问
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
//foreach iteration variable item must also be implicitly typed.">foreach 迭代变量 item 也必须转换为隐式类型,因为custQuery为匿名集合
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}

3.dynamic

  在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。

在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。

class Program
{
static void Main(string[] args)
{
dynamic dyn = 1;
object obj = 1;
dyn = dyn   3;    //编译可以通过,dynamic可以绕过编译器
obj = obj   3;    //报错,编译无法通过

System.Console.WriteLine(dyn.GetType());
System.Console.WriteLine(obj.GetType());
}
}
//输出结果
System.Int32
System.Int32

4.dynamic一些常见的用法

  (1)在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型。

class ExampleClass
{
// 字段
static dynamic field;
// 属性
dynamic prop { get; set; }
//返回值与参数
public dynamic exampleMethod(dynamic d)
{
dynamic local = "Local variable";
int two = 2;
if (d is int)
{
return local;
}
else
{
return two;
}
}
}

(2)在显式类型转换中,作为转换的目标类型。

static void convertToDynamic()
{
dynamic d;
int i = 20;
d = (dynamic)i;
Console.WriteLine(d);
string s = "Example string.";
d = (dynamic)s;
Console.WriteLine(d);
DateTime dt = DateTime.Today;
d = (dynamic)dt;
Console.WriteLine(d);
}
// Results:
// 20
// Example string.
// 2/17/2009 9:12:00 AM

(3)在以类型充当值(如 is 运算符或 as 运算符右侧)或者作为 typeof 的参数成为构造类型的一部分的任何上下文中。

int i = 8;
dynamic d;
if (someVar is dynamic) { }
d = i as dynamic;
Console.WriteLine(typeof(List<dynamic>));
//Console.WriteLine(typeof(dynamic));  //编译错误

5.dynamic与ViewBab

  ViewBab是一个dynamic类型的属性,所以编译器不会对它进行检查,所以我们可以自定义属性。我们也可以通过ExpandoObject() 这个类来实现我们自己的ViewBab,看下面示例:

public class Program
{
public static void Main(string[] args)
{
dynamic model = new ExpandoObject();    //在运行时,model 会转化为 ExpandoObject() 的一个实例
model.Index = 0;                        //ExpandoObject() 有一个事件 PropertyChanged,运行时动态触发这个事件,
model.Number = 0;                       //然后将Index与Number这个两个属性添加到类中
          Console.WriteLine(model.Index);
Console.WriteLine(model.Number);
Console.ReadKey();
}
}

也许你会觉得dynamic用到的不多,所以不必深入理解,但等到你真正遇到它时,将会吃大亏。正如上面讲的那样,它在COM API 、 动态API 、HTML对象模型的操作上有重要作用,通过它,可以简化操作,但同时它也容易让人迷糊(它所指向的究竟是什么样的对象类型),因为简化通常意味着隐藏,它将复杂的后台实现封装并开放见简单的接口给我们使用,这样简化了我们的操作,却然我们更容易迷惑,我们不知道它为什么要这样做,只知道可以这样做,使得我们在很多问题上无法深入挖掘。在网站开发中,深入理解dynamic,有利于我们深入到框架内部去,对我们学习.Net架构是非常有帮助的。

原文链接:https://www.cnblogs.com/SilentCode/p/4920598.html

更多专业前端知识,请上 【猿2048】www.mk2048.com

MVC 之var与dynamic相关推荐

  1. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. C#中的var和dynamic

    摘自:<C#中的var和dynamic> 静态类型语言也被称为强类型语言.所谓强类型语言,通俗的讲,就是在编译过程中执行类型检查的语言.我们举个简单的例子,比如我们知道一个方法的返回类型, ...

  3. var和dynamic的区别及如何正确使用dynamic?

    1.var与dynamic的区别   C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的 ...

  4. var和dynamic的区别及如何正确使用dynamic ?

    C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值, ...

  5. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

    一. 语法糖简介   语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方 ...

  6. var与dynamic区别

    注意:var与dynamic这两个关键字,只是看起来很相 似,仅此而已! var表示"变量的类型是在编译时决定的",但是dynamic表 示"变量的类型是在运行时决定的& ...

  7. 动态类型var和dynamic和传统确定类型区别和效率

    伴随着vs2010的出现,c#4.0的诞生,与之而来的动态类型dynamic更是给net程序员们锦上添花,为自己的程序书写上带来了给大的便利.可到底怎么用,好不好用,效率这么样,也许是大家最迫切关注的 ...

  8. 在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出

    1.数据信息的展示 一般情况下,我们在界面里面展示的信息是相对比较丰富的,尽管我们设计数据表的时候,考虑的是如何精简且避免重复,但是在界面上展示的信息,往往是考虑如何让用户更加方便,因此可能尽可能的展 ...

  9. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1;object b = 1; dynamic c = ...

最新文章

  1. 汇编 CALL和RET指令
  2. QT的QStorageInfo类的使用
  3. js利用localStorage和sessionStorage完成记住我功能
  4. ssl1597-石子合并问题【区间dp练习】
  5. HashMap转JavaBean
  6. 画面测试时,图片显示时,0件与N件的意义!
  7. 微信小程序物流仓库平台+后台管理系统|前后分离VUE
  8. 康耐视智能相机更新固件版本方式
  9. 手游App渠道推广统计
  10. 扫码报修开启校园报修管理系统新时代
  11. Ubuntu虚拟机重启发现用时过长 stop job is running for Unattended Upgrades Shutdown (10s / 30 min)
  12. 【大咖专栏】如何配置CEPH RGW对象存储与公有云同步
  13. 数字信号处理之信号的抽取和内插
  14. JAVA intercupt_2016年CUPT竞赛参考文献.pdf
  15. Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work
  16. 2021_GDUT_新生专题训练_数据结构
  17. 小米4刷安卓10(魔趣)
  18. 搜索技术之--以图搜图
  19. 高性能HTTP加速器Varnish-3.0.3搭建、配置及优化步骤
  20. 如何使用笔记本共享wifi给移动设备并ss上网

热门文章

  1. mysql 更新时间加数字_Mysql实战45讲笔记:8、聚合函数count
  2. 和显卡驱动要配套吗_天天学渲染,你的显卡驱动用对了吗?
  3. java json 解析null_解析包含null的原始json数组
  4. Highcharts教程--把js代码从html中抽离出来,放到单独的一个js文件中。由html页面调用...
  5. 第二天:Swift手势操控弹性按钮
  6. 关于flex,好像有12个属性非常重要
  7. 让一个非窗口组件(non-windowed component)可以接受来自Windows的消息
  8. codeblock不能调试
  9. redis key设计技巧
  10. 设计之路:如何进行软件需求分析?