【发布时间】:2024-06-24 17:15:02
【问题描述】:
在返回字符串的函数中使用 stringbuilder 时,正确的代码语法是什么(在函数末尾将 StringBuilder 实例设置为 Nothing)? 通常我会尝试使用语句“使用”,但 StringBuilder 不实现 iDisposable。
更准确地说:我想在 GC 运行时释放 StringBuilder 实例占用的内存,所以我想在 Function 结束时将 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
【问题讨论】:
-
您不需要将 StringBuilder 设置为空,.net 垃圾收集器将处理所有必要的事情。为什么你认为你需要这样做?您似乎已经知道,当一个类实现 IDisposable 时,您需要担心这一点并使用 using-block。
-
@Esko 但是 StringBuilder 没有实现可丢弃的。所以我不能写“使用 sb 作为新的 StringBuilder”。为什么你说我不需要将 StringBuilder 设置为 Nothing?在不等待 GC 的情况下销毁所有不再使用的变量不是一个好习惯吗?
-
没有所谓的“破坏变量”。如果一个类型实现了
IDisposable接口,那么你应该在处理完该类型的对象后释放它们。如果您只在定义的范围内使用它们,Using块是最好的方法。如果一个类型没有实现IDisposable,那么就没有什么可以“破坏”了。您可以将变量设置为Nothing以使其引用的对象更快地可用于垃圾回收,但是,如果变量立即超出范围,那将毫无意义。只清除一段时间后将在范围内的变量。 -
@jmcilhinney 抱歉,摧毁我的意思是把它设置为 Nothing。那么在示例中,您将在哪里将 StringBuilder 设置为 Nothing?为什么?
-
就像我之前所说的,这是一个范围界定的问题。一旦变量超出范围(调用 Return),它就会从堆栈中弹出并删除引用。如果你不能等待范围退出,你可能需要重构你的代码。您给出的示例相对简单,但是如果碰巧该方法更长并且做了更多的事情,您可以简单地将它们分解为更小的方法,从而管理声明的变量的范围。除此之外,没有办法将变量设置为 Nothing after 您已经调用了 Return。很明显,你不能在之前设置它。
标签: vb.net function stringbuilder