Возврат содержимого Stringbuilder

Тривиально я знаю, но просто интересно

У меня есть переменная stringbuilder, содержимое которой я хочу вернуть, но если она пуста, я хочу вернуть "|", поэтому лучше всего использовать stringbuilder.tostring в операторе сравнения, например

   If lReturnStringBuilder.ToString = String.Empty Then
                lReturnStringBuilder.Append("|")
            End If
return lreturnStringBuilder.tostring

или лучше преобразовать его в строку и сравнить это, даже если это означает загрузку новой переменной и выделение строкового пространства для этого, например

Dim lString as string = lReturnStringBuilder.ToString
if lString = string.empty then
      lstring = "|"
end if
return lString

person spacemonkeys    schedule 21.02.2009    source источник
comment
Не могли бы вы немного пояснить это? Я изо всех сил пытаюсь увидеть вопрос. Вот как я сделал бы это в C#: string foo = sb.ToString(); вернуть foo.IsNullOrEmpty() ? | : фу   -  person Iain Holder    schedule 21.02.2009
comment
просто String.IsNullOrEmpty() не строка.   -  person abatishchev    schedule 21.02.2009
comment
@abatishchev Хорошо подмечено. Я был эм, проверял тебя..   -  person Iain Holder    schedule 21.02.2009
comment
@abatishchev Отредактировано соответственно.   -  person Iain Holder    schedule 21.02.2009
comment
делать [вернуть sb.Length == 0 ? | : sb.ToString() ] убережет вас от преобразования StringBuilder в строку, когда StringBuilder ничего не содержит.   -  person Ashish Gupta    schedule 01.11.2010


Ответы (4)


Это своего рода микрооптимизация, о которой вам действительно не нужно беспокоиться. Тем не менее, я опубликую то, что я считаю наиболее элегантным (и эффективным) способом сделать это в любом случае:

Dim result = If(lReturnString.Length = 0, "|", lReturnString.ToString())

Это избавляет от ненужного преобразования пустого StringBuilder в строку (или последующего вызова Append, что определенно не требуется). Обратите внимание на использование встроенного оператора If (VB 9.0), который не оценивает оба оператора ни в одном случае, поскольку это языковая конструкция, а не функция (точно эквивалентная обычному оператору If с переменные назначения).

person Noldorin    schedule 21.02.2009
comment
Ура, оцените комментарий «своего рода микрооптимизация», просто интересно, пока возитесь с stringbuilder … не понимал, что вы можете использовать такое выражение if в vb.net … грустный день, когда вы узнаете что-то новое о оператор if !!! - person spacemonkeys; 21.02.2009
comment
Да, это достаточно справедливо. Встроенный оператор If в VB.NET является одной из тех скрытых функций, о которых, я уверен, на удивление многие программисты не знают! (Принимая во внимание, что более старый IIf или эквивалент C# известны гораздо лучше.) - person Noldorin; 21.02.2009
comment
Когда я увидел If, я собирался спросить, есть ли в VB троичный оператор... ох! - person tsimon; 22.02.2009

Вы выделяете «пространство для строк» ​​независимо от того, что вы делаете. Функция ToString дает вам строку независимо от того, присваиваете ли вы значение переменной или нет. Поэтому я бы посоветовал вам лучше всего присвоить значение ToString() переменной, а затем проверить это значение переменной для пустой строки. Что-то вроде (извините, я парень С#, но, надеюсь, это будет работать в VB):

Dim returnVal as String
returnVal = lReturnString.ToString()
If String.IsNullOrEmpty(returnVal) Then
  returnVal = "|"
End If
person JoshL    schedule 21.02.2009
comment
Вот что я подумал. Вот почему я не вижу вопроса. - person Iain Holder; 21.02.2009

Вам следует избегать вызова ToString в StringBuilder, а затем добавлять к нему больше. Когда вы вызываете метод ToString, вы получаете строку, которая использовалась внутри StringBuilder. Если вы затем добавите больше к StringBuilder, он должен выделить новую строку.

Просто используйте свойство Length, чтобы проверить, пуст ли StringBuilder, и если это так, вам не нужно привлекать StringBuilder для создания результата.

If lReturnStringBuilder.Length = 0 Then
   Return "|"
Else
   Return lReturnStringBuilder.ToString()
End If
person Guffa    schedule 21.02.2009

Вы можете использовать свойство Length вашего Объект StringBuilder. Таким образом, вы можете избежать вызова ToString() в первый раз:

If lReturnStringBuilder.Length = 0 Then
   lReturnStringBuilder.Append("|")
End If

Return lReturnStringBuilder.ToString()

or

If lReturnStringBuilder.Length = 0 Then
   Return "|"
End If

Return lReturnStringBuilder.ToString()
person splattne    schedule 21.02.2009