Pau*_*ner 22 .net c# design-patterns anti-patterns
我在不同的公司中使用不同版本的.NET编写的许多遗留系统,我不断寻找以下模式的示例:
public void FooBar()
{
object foo = null;
object bar = null;
try
{
foo = new object();
bar = new object();
// Code which throws exception.
}
finally
{
// Destroying objects
foo = null;
bar = null;
}
}
Run Code Online (Sandbox Code Playgroud)
对于任何知道内存管理在.NET中如何工作的人来说,这种代码是非常不必要的; 垃圾收集器不需要您手动分配null以告知可以收集旧对象,也不需要分配null指示GC立即收集对象.
这种模式只是噪声,使得理解代码试图实现的内容变得更加困难.
那么,为什么我一直在寻找这种模式呢?是否有一所学校教授这种做法?是否有一种语言,null需要为本地范围的变量赋值才能正确管理内存?明确指定null我还没有得到一些额外的价值吗?
Aar*_*lla 22
这是FUD 货物狂热编程(感谢Daniel Earwicker),他们习惯于"释放"资源,糟糕的GC实现和糟糕的API.
一些GC没有很好地处理循环引用.要摆脱它们,你必须"在某个地方"打破这个循环.哪里?好吧,如果有疑问,那么无处不在.这样做了一年,它已经移动到你的指尖.
同时设置字段可以null让您了解"做某事",因为作为开发人员,我们总是担心"忘记某些事情".
最后,我们必须明确关闭API,因为没有真正的语言支持来说"当我完成它时关闭它"并让计算机像GC一样解决它.所以你有一个API,你必须在那里调用清理代码和API.这会吸引并鼓励上述模式.
它可能来自VB,它使用引用计数策略进行内存管理和对象生存期.将引用设置为Nothing(等效于null)将减少引用计数.一旦该计数变为零,则该对象被同步销毁.离开方法的范围后,计数将自动递减,因此即使在VB中,这种技术大多无用,但是在某些特殊情况下,您可能希望贪婪地销毁对象,如下面的代码所示.
Public Sub Main()
Dim big As Variant
Set big = GetReallyBigObject()
Call big.DoSomething
Set big = Nothing
Call TimeConsumingOperation
Call ConsumeMoreMemory
End Sub
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,引用的对象big将一直徘徊到没有调用的结尾Set big = Nothing.如果该方法中的其他内容是耗时的操作或产生更多的内存压力,那么这可能是不合需要的.
| 归档时间: |
|
| 查看次数: |
2252 次 |
| 最近记录: |