在函数中使用字符串生成器 vb.net 语法



在返回字符串的函数中使用字符串生成器时,正确的代码语法是什么(在函数末尾将 StringBuilder 实例设置为 Nothing)? 通常我尝试使用语句"using",但StringBuilder没有实现iDisposable。

更准确地说:我想在 GC 运行时释放从 StringBuilder 实例占用的内存,所以我想在函数末尾将 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

我在 c# 中编写了相同的函数,在您的情况下不需要清理"字符串生成器"变量,但是,要在返回语句之后进行某些清洁,您可以使用 try...最后阻止。

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

好的,感谢一些用户(@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

为什么? 因为方法内部的每个局部变量,当代码执行退出方法时,都会被垃圾回收器自动"清理"(GC 释放以前被局部变量占用的内存,但如果代码的执行将在垃圾回收器运行之前再次使用该方法,则先前占用的内存区域将由局部变量的新实例的指针重新分配)。

不同的方法是当方法使用非局部变量时:

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 的情况。

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

在此之后,可能会想到一个问题:

">

但是,如果我等待垃圾收集器将"释放"内存,我需要等待多长时间?蜱。。。毫秒。。。秒。。。纪要。。。?

这里有一个可以提供帮助的链接:

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

最新更新