asp.net C#中dynamic的用法

dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 该类型简化了对 com api(例如 office automation api)、动态 api(例如 ironpython 库)和 html 文档对象模型 (dom) 的访问。

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

以下示例将类型为 dynamic 的变量与类型为 object 的变量对比。 若要在编译时验证每个变量的类型,请将鼠标指针放在 writeline 语句中的 dyn 或 obj 上。 intellisense 显示了 dyn 的“动态”和 obj 的“对象”。

class program
{
    static void main(string[] args)
    {
        dynamic dyn = 1;
        object obj = 1;

        // rest the mouse pointer over dyn and obj to see their
        // types at compile time.
        system.console.writeline(dyn.gettype());
        system.console.writeline(obj.gettype());
    }
}

writeline 语句显示 dyn 和 obj 的运行时类型。 此时,两者具有相同的整数类型。 将生成以下输出:

system.int32

system.int32

若要查看 dyn 和 obj 之间的差异,请在前面示例的声明和 writeline 语句之间添加下列两行之间。

复制 dyn = dyn + 3;
obj = obj + 3;
为尝试添加表达式 obj + 3 中的整数和对象报告编译器错误。 但是,不会报告 dyn + 3 错误。 编译时不会检查包含 dyn 的表达式,原因是 dyn 的类型为 dynamic。

于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。

dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:

于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。
dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:

于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。 dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:

dynamic可以简化反射。

以前我们这样使用反射:

    public class dynamicsample
    {
        public string name { get; set; }

        public int add(int a, int b)
        {
            return a + b;
        }
    }
            dynamicsample dynamicsample = new dynamicsample();   //create instance为了简化演示,我没有使用反射
            var addmethod = typeof(dynamicsample).getmethod("add");
            int re = (int)addmethod.invoke(dynamicsample, new object[] { 1, 2 });

现在,我们有了简化的写法:

            dynamic dynamicsample2 = new dynamicsample();
            int re2 = dynamicsample2.add(1, 2);

我们可能会对这样的简化不以为然,毕竟看起来代码并没有减少多少,但是,如果考虑到效率兼优美两个特性,那么dynamic的优势就显现出来了

时间: 2024-10-28 13:38:49

asp.net C#中dynamic的用法的相关文章

ASP.NET MVC3 中的UrlRewrite用法介绍

ASP.NET MVC3中自带的Url重写工具,今天和大家一起分享一下简单的实现过程. 最后要实现的结果:以二级域名的形式传递城市拼音并解析.如下图所示: 第一步:创建一个UrlProvider.cs类文件,其类要继承路由基类RouteBase.  代码如下 复制代码 继承RouteBase后需要实现两个方法: public override RouteData GetRouteData(HttpContextBase httpContext) {     throw new NotImplem

asp中Split的用法示例

示例|split 大家有没有碰到过要想取一字符串里的某些值而无从下手?有没有觉得看书或教材对split的写法糊里糊涂--如果有此疑问的话,请看下面我对例子的解释,相信您会对这个有一定的了解. 例如我想取得一个ftp里的用户名及密码(服务器等)值(用IE当FTP时或从表中取出FTP的值).下面是我的解决思路:设url为收到的URL值,这里指:url=ftp://username:password@server,请注意这句暗墓媛?br>我想大家都看清楚这个URL里的规律了吧,就是各个部分都被"

ASP.NET2.0中的ClientScriptManager 类用法

asp.net|client ASP.NET2.0中的ClientScriptManager 类用法-如何添加客户端事件 在ASP.NET2.0中,ClientScriptManager 类通过键 String 和 Type 唯一地标识脚本.具有相同的键和类型的脚本被视为重复脚本.因此,我们可以使用脚本类型来避免混淆可能用在页中的来自不同用户控件的相似脚本. <html>  <head>    <title>ClientScriptManager Example<

改善C#程序的建议2:C#中dynamic的正确用法

原文:改善C#程序的建议2:C#中dynamic的正确用法 dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错:   dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(d

【转载】Asp.net中DataBinder.Eval用法的总结

摘自 http://www.cnblogs.com/liuzijing688/archive/2008/03/27/1124623.html Asp.net中DataBinder.Eval用法的总结 <%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# DataBinder.Eval(Container.DataItem, "[n]") %&

asp.net-Asp.net中GridView中button的用法

问题描述 Asp.net中GridView中button的用法 在网上查了资料,用法如下: <asp:TemplateField> <ItemTemplate> <asp:Button ID=""Button2"" runat=""server"" CausesValidation=""false"" CommandName=""&quo

ASP.NET MVC中使用JavaScriptResult的用法示例_实用技巧

本文实例讲述了ASP.NET MVC中使用JavaScriptResult的用法.分享给大家供大家参考,具体如下: 在页面中我们使用JavaScript来设置id为qubernet的span标签样式,具体代码如下: JS: <script> $(function () { var thisObj = document.getElementById("qubernet"); thisObj.setAttribute("style", "color

详解ASP.NET中Session的用法_实用技巧

      当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话.        通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象.当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有

ASP.NET中Dictionary基本用法实例分析_实用技巧

本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /* * 使用Dictionary之前必须引用System.Collections.Generic命名空间: * 使用Dictionary时必须声明其键和值的数据类型(可以为任意类型): */ //声明实例化Dictionary为dic System.Collections.Generic.Dictionary