浅谈
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 属性。虽然表达式有些长,但似乎也是个不错的解决方法。性
能嘛
……肯定是有所提高了。