background image

浅谈

Eval 的性能

好吧,你偏要说

Eval 性能差

  写

ASP.NET 中使用 Eval 是再常见不过的手段了,好像任何一本 ASP.NET 书里都会描

述如何把一个

DataTable 绑定到一个控件里去,并且通过 Eval 来取值的用法。不过在目前的

DDD(Domain Driven Design)时代,我们操作的所操作的经常是领域模型对象。我们可以
把任何一个实现了

IEnumerable 的对象作为绑定控件的数据源,并且在绑定控件中通过

Eval 来获取字段的值。如下:
protected void Page_Load(object sender, EventArgs e)
{
    List<Comment> comments = GetComments();
    this.rptComments.DataSource = comments;
    this.rptComments.DataBind();
}
<asp:Repeater runat="server" ID="rptComments">
    <ItemTemplate>
        Title: <%# Eval("Title") %><br />
        Conent: <%# Eval("Content") %>
    ItemTemplate>
    <SeparatorTemplate>
        <hr />
    SeparatorTemplate>
asp:Repeater>
  在这里,

Eval 对象就会通过反射来获取 Title 和 Content 属性的值。于是经常就有人会见

到说:

“反射,性能多差啊,我可不用!”。在这里我还是对这种追求细枝末节性能的做法持

保留态度。当然,在上面的例子里我们的确可以换种写法:
<asp:Repeater runat="server" ID="rptComments">
    <ItemTemplate>
        Title: <%# (Container.DataItem as Comment).Title %><br />
        Conent: <%# (Container.DataItem as Comment).Content %>
    ItemTemplate>
    <SeparatorTemplate>
        <hr />
    SeparatorTemplate>
asp:Repeater>
  我们通过

Container.DataItem 来获取当前遍历过程中的数据对象,将其转换成 Comment

之后读取它的

Title 和 Content 属性。虽然表达式有些长,但似乎也是个不错的解决方法。性

能嘛

……肯定是有所提高了。