热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET中数据邦定效率问题的一点看法转载(自由的天空)

在做Asp.NET开发的时候经常用到DataList、Repeater等,用这些控件的时候经常用到数据邦定,很多程序员都是按照MS提供的方法

在 做Asp.NET开发的时候经常用到DataList、Repeater等&#xff0c;用这些控件的时候经常用到数据邦定&#xff0c;很多程序员都是按照MS提供的方 法<%#DataBinder.Eval(Container.DataItem,"xxx") %>进行邦定&#xff0c;经常听人说这样邦定效率低&#xff0c;那么到底哪里引起的效率低呢&#xff1f;不妨大家打开MS的代码来看看他是这么实现这个数据邦定的&#xff0c;这样一切都清楚 了。DataBinder是System.Web.UI中的一个静态类。首先看一下它的Eval方法:

 

public static object Eval (object container, string expression)
{
     if (expression &#61;&#61; null)
      {
          throw new ArgumentNullException("expression");
      }
      expression &#61; expression.Trim();
     if (expression.Length &#61;&#61; 0)
      {
          throw new ArgumentNullException("expression");
      }
     if (container &#61;&#61; null)
      {
          return null;
      }
     return DataBinder.Eval(container, expression.Split(DataBinder.expressionPartSeparator));
}

 

这个方法调用了另外一个重载的Eval方法我们接着看这个方法:

 

private static object Eval (object container, string[] expressionParts)
...{
     object obj1 &#61; container;
     for (int num1 &#61; 0;(num1      ...{
          string text1 &#61; expressionParts[num1];
          if (text1.IndexOfAny(DataBinder.indexExprStartChars) <0)
          ...{
                obj1 &#61; DataBinder.GetPropertyValue(obj1, text1);
           }
          else
          ...{
                obj1 &#61; DataBinder.GetIndexedPropertyValue(obj1, text1);
           }
      }
     return obj1;
}

 

在这个方法中有一个GetIndexedPropertyValue方法是处理索引用的&#xff0c;一般邦定用到的是上边的GetPropertyValue方法。继续看GetPropertyValue方法:

 

public static object GetPropertyValue (object container, string propName)
{
     if (container &#61;&#61; null)
      {
          throw new ArgumentNullException("container");
      }
     if (string.IsNullOrEmpty(propName))
      {
          throw new ArgumentNullException("propName");
      }
     object obj1 &#61; null;
      PropertyDescriptor descriptor1 &#61; TypeDescriptor.GetProperties(container).Find(propName, true);
     if (descriptor1 &#61;&#61; null)
      {
          throw new HttpException(SR.GetString("DataBinder_Prop_Not_Found", new object[]{container.GetType().FullName, propName}));
      }
     return descriptor1.GetValue(container);
}

 

晕~~ 这个方法中利用TypeDescriptor的GetProperties方法将邦定对象反射然后用GetValue获取我们想要的值&#xff01; 看到这里我想大家都已经看清楚了&#xff0c;原来当我们调用<%#DataBinder.Eval(Container.DataItem,"xxx") %>时是将Container.DataItem反射然后用GetValue取值的&#xff0c;也就是说如果你页面中有多个DataBinder的话每个都要 反射、取值&#xff01;晕倒~ 反射是非常消耗资源而且效率低下的这个不用我说了。对于反射只有在动态加载程序集或者在未知数据类型的情况下不得已才用得&#xff0c;显然我们对我们要邦定的数据既 不需要动态加载也不是未知数据类型&#xff0c;那么完全没有必要用这个既浪费资源又非常慢的技术。看来MS提供的这个DataBinder.Eval玩意儿真不是什 么好东西&#xff0c;呵呵。

    不过咱们稍微改进一下效率可以提高数十倍甚至数百倍。既然大家知道瓶颈出在反射上那咱们就不用反射&#xff0c;怎么办呢&#xff1f;答案是不用DataBinder.Eval邦定&#xff0c;具体如下:

第 一种方法:这种方法好多地方介绍过。用在邦定页面上把Container.DataItem转换为邦定类型&#xff0c;如:我们在用DataTable做数据源的时 候其实Container.DataItem就是DataRowView那么把Container.DataItem转换为DataRowView不就可 以用索引直接取值了吗&#xff1f;:<%#((DataRowView)Container.DataItem)["xxx"]%> 哈哈&#xff0c;这样效率有大幅度提升&#xff0c;尤其在数据量大的时候。

第二种方法:上一种方法虽好但是每次取值的时候都要转换一下&#xff0c;还不够完美。能不能一下 转过来然后再所有邦定中直接取呢&#xff1f;答案是肯定的&#xff01;我们可以在DataList、Repeater的ItemCreated事件中做文章&#xff0c;我们在定义一个 protected 变量&#xff0c;变量类型为邦定数据类型。如protected DataRowView Info &#61;null; 然后再ItemCreated中进行转换付值。最后在前台邦定时写成&#xff1f;<%#Info ["xxx"]%>代码:

        protected DataRowView Info &#61; null;
        protected void RepInfoList_ItemCreated(object sender, RepeaterItemEventArgs e)
         {
             Info &#61; e.Item.DataItem as DataRowView;
         }

如果用户用IList做数据源就更简单了&#xff1a;

protected BbsInfo Info &#61;null;
protected void RepInfoList_ItemCreated(object sender, RepeaterItemEventArgs e)
{
         Info &#61; e.Item.DataItem as BbsInfo
}


前台邦定变为<%#Info.Title%>

总 结&#xff1a;MS确实提供了很多方便快捷的功能&#xff0c;但是方便和快捷的背后是性能的损失&#xff0c;这些方便快捷的方法只是提供给一些初级阶段的程序员来更快的完成一些工作&#xff0c;他 们并不注重效率。但是如果要求高效率那么就要自己动手&#xff0c;这就要求我们要对.NET要有深刻的认识&#xff0c;所以要想成为高手必须深入理解.NET机理&#xff0c;做到随心所 欲。


转:https://www.cnblogs.com/beizaibeifang/p/3616907.html



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文以 www.域名.com 为例,详细介绍如何为每个注册用户提供独立的二级域名,如 abc.域名.com。实现这一功能的核心步骤包括:首先,确保域名支持泛解析,即将 A 记录设置为 *.域名.com,以便将所有二级域名请求指向同一服务器。接着,在服务器端使用 ASP.NET 2.0 进行配置,通过解析 HTTP 请求中的主机头信息,动态识别并处理不同的二级域名,从而实现个性化内容展示。此外,还需在数据库中维护用户与二级域名的对应关系,确保每个用户的二级域名都能正确映射到其专属内容。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
author-avatar
php.com
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有