我使用的是vb.net 12,所以不允许使用多行字符串,因为它们在C中。
我在vb.net中有以下代码,需要将其转换为单个代码
AppendFormat
. 这在C中非常容易,因为为了更好的可读性/维护,长字符串可以分布在多行上,但在VB.NET中,如果不使用
&
但是,使用StringBuilder的目的就被挫败了。
问题
我能把下面的vb.net转换为使用单个
附加格式
不使用字符串连接运算符
&
?
'use a stringbuilder for better string performance
Dim sb As New StringBuilder()
sb.Append("<html>")
sb.Append("<head><style>body {font-size:10pt; font-family:Arial, Sans Serif;} table{margin:0; padding:0; border-collapse:collapse;} td{border:solid 1px #eee; padding:2px;}")
sb.Append(".m{color:#f00; font-weight:bold; font-size:14pt; margin-bottom:9px;} .t{width:120px; font-weight:bold; font-size:8pt;} .d{width:500px;}")
sb.Append("</style></head>")
sb.Append("<body>")
sb.AppendFormat("<div class='m'> {0} </div><table>", ex.Message.ToString())
sb.AppendFormat("<tr><td class='t'>REQUEST URL</td><td class='d'> {0} </td></tr>", currentContext.Request.Url.OriginalString)
sb.AppendFormat("<tr><td class='t'>REQUEST PATH</td><td class='d'> {0} </td></tr>", currentContext.Request.Path)
sb.AppendFormat("<tr><td class='t'>QUERY STRING</td><td class='d'> {0} </td></tr>", currentContext.Request.QueryString.ToString())
sb.AppendFormat("<tr><td class='t'>TARGET SITE</td><td class='d'> {0} </td></tr>", ex.TargetSite.Name)
sb.AppendFormat("<tr><td class='t'>STACK TRACE</td><td class='d'> {0} </td></tr>", ex.StackTrace)
sb.AppendFormat("<tr><td class='t'>USERID</td><td class='d'> {0} </td></tr>", userId)
sb.AppendFormat("<tr><td class='t'>USER</td><td class='d'> {0} </td></tr>", userName)
sb.Append("</table>")
sb.Append("</body>")
sb.Append("</html>")
更新
我使用Steve的答案,在这个答案中他建议使用XML元素。我唯一需要做的就是在表达式中的每个花括号前面加上相同的花括号,以避开花括号。工作代码如下。
Dim s As XElement = <html>
<head>
<style>
body{{font-size:10pt; font-family:Arial, Sans Serif;}}
table{{margin:0; padding:0; border-collapse:collapse;}}
td{{border:solid 1px #eee; padding:2px;}}
.m{{color:#f00; font-weight:bold; font-size:14pt; margin-bottom:9px;}}
.t{{width:120px; font-weight:bold; font-size:8pt;}}
.d{{width:500px;}}
</style>
</head>
<body>
<div class='m'>{0}</div>
<table>
<tr><td class='t'>REQUEST URL</td><td class='d'>{1}</td></tr>
<tr><td class='t'>REQUEST PATH</td><td class='d'>{2}</td></tr>"
<tr><td class='t'>QUERY STRING</td><td class='d'>{3}</td></tr>"
<tr><td class='t'>TARGET SITE</td><td class='d'>{4}</td></tr>
<tr><td class='t'>STACK TRACE</td><td class='d'>{5}</td></tr>
<tr><td class='t'>USERID</td><td class='d'>{6}</td></tr>
<tr><td class='t'>USER</td><td class='d'>{7}</td></tr>
</table>
</body>
</html>
email.Body = sb.AppendFormat(s.ToString(), ex.Message.ToString(), _
currentContext.Request.Url.OriginalString, _
currentContext.Request.Path, _
currentContext.Request.QueryString.ToString(), _
ex.TargetSite.Name, ex.StackTrace, userId, userName).ToString()
性能更新
我尝试了这里讨论的所有3种方法,以找出在我的场景中哪一种最有效。因此,我使用这些方法运行了我的ASP.NET场景(每个测试只实现了一个)
-
测试1:xelement with stringbuiler.format
-
测试2:带有内联表达式的Xelement
-
测试3:在我的问题中给出的代码中具有多个附录和AppendFormat的StringBuilder
我使用秒表对象在每次运行中经过的滴答数发现如下。我为每个方法运行了4次ASP.NET场景。
看来,第三种方法的StringBuilder是最快的
.
-
测试1:Xelement with StringBuilder格式:6505、657、426、446
-
测试2:带有内联表达式的Xelement:6326、414、422、635
-
测试3:StringBuilder附加/附加格式:6588、351345、280
我认为Xelement在有人读取/维护您的代码时提供了更好的可读性,但Xelement方法在性能上无法击败StringBuilder。