Я использую VB.Net 12, поэтому многострочные строки не разрешены, как в C #.
У меня есть следующий код в VB.Net, который мне нужно преобразовать в один AppendFormat
. Это очень просто в C #, так как длинная строка может быть распределена по нескольким строкам для лучшей читаемости / обслуживания, но это не представляется возможным в VB.Net без объединения строк с использованием оператора &
; но тогда цель использования StringBuilder будет побеждена.
Вопрос
Могу ли я преобразовать следующий VB.Net для использования одного AppendFormat
без использования оператора конкатенации строк &
?
'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>")
UPDATE
Я заставил его работать, используя ответ Стива, в котором он предложил использовать элемент 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 с StringBuiler.Format
- ТЕСТ 2: XElement со встроенными выражениями
- ТЕСТ 3: StringBuilder с несколькими объектами Append и AppendFormat, как в коде, приведенном в моем вопросе
То, что я нашел, используя галочки, прошедшие с объекта Секундомер для каждого запуска, как показано ниже. Я запускал свой сценарий ASP.Net 4 раза для каждого подхода. И кажется, что третий подход StringBuilder - самый быстрый .
- ТЕСТ 1: XElement с форматом StringBuilder: 6505, 657, 426, 446
- ТЕСТ 2: XElement со встроенными выражениями: 6326, 414, 422, 635
- ТЕСТ 3: StringBuilder добавляет / дополняет форматы: 6588, 351 345, 280
Я думаю, что XElement обеспечивает лучшую читаемость, когда кто-то читает / поддерживает ваш код, но подходы XElement не могут превзойти StringBuilder по производительности.