【发布时间】: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 有重载 - 这意味着结论是 导致装箱 - 无论它是否会导致性能损失:-)
【问题讨论】:
-
始终使用
<%:。如果类型转换为 HTML 字符串,它应该实现IHtmlString。忘记装箱,您指定用于评估的项目将通过使用IConvertible或调用ToString转换为字符串。 -
如果您出于性能原因担心装箱,请考虑静态 HTML、JQuery 和 WebAPI。
标签: c# asp.net webforms boxing