Как я могу объединить многострочные добавления в VB.Net 12 в один AppendFormat - PullRequest
0 голосов
/ 12 января 2019

Я использую 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 по производительности.

1 Ответ

0 голосов
/ 12 января 2019

Здесь ваш код с XML-литералами . Я попытался использовать непосредственно строку, но по какой-то причине результат обрезается, а некоторая часть исходного текста отсутствует. Однако, используя XElement, он работает правильно

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'><%= ex.Message %></div> 
        <table> 
            <tr> 
                <td class='t'>REQUEST URL</td> 
                <td class='d'><%= currentContext.Request.Url.OriginalString %></td> 
            </tr> 
            <tr> 
                <td class='t'>REQUEST PATH</td> 
                <td class='d'><%= currentContext.Request.Path %></td> 
            </tr> 
            <tr> 
                <td class='t'>QUERY STRING</td> 
                <td class='d'><%= currentContext.Request.QueryString.ToString() %></td> 
            </tr> 
            <tr> 
                <td class='t'>TARGET SITE</td> 
                <td class='d'><%= ex.TargetSite.Name %></td> 
            </tr> 
            <tr> 
                <td class='t'>STACK TRACE</td> 
                <td class='d'><%= ex.StackTrace %></td> 
            </tr> 
            <tr> 
                <td class='t'>USERID</td> 
                <td class='d'><%= userId %></td> 
            </tr> 
            <tr> 
                <td class='t'>USER</td> 
                <td class='d'><%= userName %></td> 
            </tr> 
        </table> 
    </body> 
</html> 

Мы можем использовать двойные фигурные скобки вокруг фигурных скобок в блоке стиля, а затем использовать string.Format для замены параметров. (Частичный блок взят из кода выше)

....
body {{font-size:10pt; font-family:Arial, Sans Serif;}} 
....

На этом этапе мы можем использовать формат String.Format для разрешения кода, стоящего за форматированием всего текста

Dim text = String.Format(s.ToString(), ex.Message, .........)
...