代码之家  ›  专栏  ›  技术社区  ›  Sunil

如何将vb.net 12中的多行附加合并为单个附加格式

  •  0
  • Sunil  · 技术社区  · 6 年前

    我使用的是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。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Steve    6 年前

    这是您的代码 XML Literals . 我试图直接使用一个字符串,但由于某种原因,结果会被截断,并且原始文本的某些部分会丢失。但是,使用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, .........)