1

将值类型作为类型对象传递给 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%>

网络表单视图引擎会将其“编译”成类似

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

“魔术没有拳击”的场景?

更新

以下 Joe 的示例显示 <%:nyInt%> 被转换为

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

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

4

1 回答 1

1

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

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

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

至于拳击,你不应该担心。

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

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

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

于 2013-08-28T10:53:07.447 回答