【问题标题】:ASP.NET C#: Will <%:myInt%> result in boxing?ASP.NET C#:<%:myInt%> 会导致装箱吗?
【发布时间】:2013-08-28 10:41:21
【问题描述】:

将值类型作为类型 object 传递给 C# 中的函数并发生装箱。

在 ASP.NET 中,我们分别有 Response.Write(..) 和 Response.Write(Server.HtmlEncode(..)) 的简写,

Response.Write(..) 存在 char、string 和 object 的重载 - 因此我假设此代码将导致 Response.Write(object) 被调用并且 int 被装箱:

<%int myInt = 3;%>
<%=myInt%>

虽然据我了解,这个版本不会导致拳击:

<%=myInt.ToString()%>

(如有错误请指正)

但是

Server.HtmlEncode() 只接受一个字符串作为参数,不能用对象类型调用。那么在这种情况下发生了什么:

<%:nyInt%>

webform 视图引擎会将其“编译”成类似

Response.Write(Server.HtmlEncode(myInt.ToString))

“魔法无拳击”场景?

更新

以下 Joe 的示例显示 被翻译为

@__w.Write(System.Web.HttpUtility.HtmlEncode(myInt));

System.Web.HttpUtility.HtmlEncode 对 object 有重载 - 这意味着结论是 导致装箱 - 无论它是否会导致性能损失:-)

【问题讨论】:

  • 始终使用&lt;%:。如果类型转换为 HTML 字符串,它应该实现 IHtmlString。忘记装箱,您指定用于评估的项目将通过使用IConvertible 或调用ToString 转换为字符串。
  • 如果您出于性能原因担心装箱,请考虑静态 HTML、JQuery 和 WebAPI。

标签: c# asp.net webforms boxing


【解决方案1】:

如果您想知道生成的源代码是什么样的,一种简单的方法是在页面中添加一些带有故意编译时错误的脚本,例如

    <script runat="server"> 
        deliberate error here
    </script>

编译失败时显示的错误页面包括一个查看完整生成源代码的链接,它将回答您上面的问题。

至于拳击,你不必担心。

反复装箱和拆箱可能会降低性能,例如:

object myInt;
...
for (i=0; i<aVeryLargeNumber; i++)
{
    ...
    myInt = ((int)myInt)+1;
    ...
}

但在你上面的例子中,没有理由担心。

【讨论】:

  • 我不关心性能 - 只是对拳击场景感到好奇 :-)
猜你喜欢
  • 2011-04-03
  • 2010-11-10
  • 2012-03-11
  • 2010-09-30
  • 2011-01-25
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2019-10-26
相关资源
最近更新 更多