Синтаксис vb.net с использованием stringbuilder в функции - PullRequest
0 голосов
/ 12 июня 2019

Каков правильный синтаксис кода (установите для экземпляра StringBuilder значение Nothing в конце функции), если в функции, возвращающей строку, используется stringbuilder?Обычно я пытаюсь использовать оператор 'using', но StringBuilder не реализует iDisposable.

Точнее, я хочу освободить память, занятую экземпляром StringBuilder, когда GC будет работать, поэтому я быхотел бы установить экземпляр StringBuilder на Nothing в конце функции.

Пожалуйста, кто-нибудь знает, "где" я должен установить экземпляр StringBuilder на Nothing?

Вот код.

Function GetString() As String
    Try()
        Dim sb As New StringBuilder
        sb.AppendLine("my first line")
        Return sb.ToString()
        'Should i put here 'sb = Nothing' ?
    Catch()
        Return Nothing
    End Try()
End Function

Или лучше это решение?

Function GetString() As String
    Dim sb As New StringBuilder
    Try()
        sb.AppendLine("my first line")
        Return sb.ToString()
    Catch()
        Return Nothing
    End Try()
    'Or should i put here 'sb = Nothing' ?
End Function

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Хорошо, спасибо некоторым пользователям (@jmcilhinney, @ Anu6is), которые потратили много времени, помогая мне учиться, я публикую свой ответ.

Правильный синтаксис для освобождения локальных ресурсов в методе таков:

Function GetString() As String
    Try()
        Dim sb As New StringBuilder
        sb.AppendLine("my first line")
        Return sb.ToString()
    Catch()
        Return Nothing
    Finally()
        'N.B. Good practice don't write
        'sb = Nothing
    End Try()
End Function

Пожалуйста, обратите внимание, что в утверждении «Я» я написал «Хорошая практика», чтобы не писать »

sb = Nothing

Почему? Поскольку каждая локальная переменная внутри метода, когда выполнение кода выходит из метода, автоматически «очищается» сборщиком мусора (сборщик мусора освобождает память, ранее занятую локальными переменными, но если при выполнении кода будет использоваться снова метод перед запуском сборщика мусора, ранее занятая область памяти будет перераспределена указателем новых экземпляров локальных переменных).

Другой подход, когда метод использует нелокальную переменную:

Class MyClass
    Dim sb As New StringBuilder

    Friend Function GetString(ByVal text as String()) As String
        Try()
            For Each Txt As String In text
                sb.AppendLine(Txt)
            Next Txt
            Return sb.ToString
        Catch()
            Return Nothing
        Finally()
            'Here i can write:
            'sb.Clear
            'or
            'sb = Nothing 
        End Try()
     End Function
 End Class

Почему в этом случае целесообразно установить для переменной значение Nothing или (в этом случае) освободить память, занятую значением StringBuilder?

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

Или, если StringBuilder «хранит» огромное количество данных, в течение длительного времени.

В этом случае мы «выбираем» установить для StringBuilder значение Nothing, чтобы освободить занятую память, которая не будет использоваться программой.

В этой статье подробно объясняются случаи, когда рекомендуется устанавливать для переменной значение Nothing внутри метода.

https://blog.stephencleary.com/2010/02/q-should-i-set-variables-to-null-to.html

После этого может возникнуть вопрос:

'Но если я подожду, когда сборщик мусора "освободит" память, как долго мне ждать? ... тики ... миллисекунды, ... секунды, ... минуты ...?

Вот ссылка, которая может помочь:

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals

0 голосов
/ 12 июня 2019

Я написал ту же функцию на c #, в вашем случае нет необходимости очищать переменную "stringbuilder", но для обеспечения определенной очистки после оператора return вы можете использовать блок try ... finally.

static string GetString()
{
     StringBuilder sb = new StringBuilder();
     try
     {
          sb.AppendLine("myfirstline");
          return sb.ToString();
     }
     finally
     {
          sb = null;
     }
}
...