在C#中成员多次实例化类变量的含义

时间:2012-01-18 20:30:02

标签: c# garbage-collection scope instantiation

我正在查看其他人的代码并想知道为什么有人会这样做以及它会在C#中产生什么样的影响。我已经看到了一些关于其他语言或类似场景的信息,但没有看到这个具体情况。

这是一项Web服务业务规则。

public class MyClass
{
 StringBuilder strBuild = new StringBuilder();
 SQLText sqlQry = new SQLText();
 ...

 public myMethod1()
 {
   strBuild = new StringBuilder();
   sqlQry = new SQLText();
   ...
 }

 private myMethod2()
 {
   strBuild = new StringBuilder();
   sqlQry = new SQLText();
   ...
 }

 ...
}

如果我写这篇文章,我不会创建类变量,只会在我需要的每种方法中为StringBuilder和SQLText类型创建局部变量。以上似乎是糟糕的编程,因为它本质上创建了一个全局变量,必须记住在每个方法中实例化或重新实例化(“清除”它)。

但上面的代码是否真的有害?

  1. 垃圾收集器如何处理?如果类变量在不同方法中被实例化30次,它将失去对初始声明的跟踪并且无法释放内存或者它最终是否会被清除?

  2. 性能怎么样?在一堆不同的方法中使用相同的类变量或在相应的方法中创建局部变量是否更快?

1 个答案:

答案 0 :(得分:3)

  

但上面的代码是否真的有害?

是的 - 它会破坏班级的状态。看起来这个类不应该真的有任何状态 - 这些应该是本地变量。但是,对于不经意的观察者来说,这似乎是与对象相关联的真实状态。

  

1)垃圾收集器如何处理这个问题?如果类变量在不同的方法中实例化了30次,它会失去对初始声明的跟踪并且无法释放内存,还是最终会被清除?

实例变量没有“实例化” - 它们只是被分配了。并且一旦先前的值被覆盖,如果没有其他内容引用旧值所引用的对象,则该对象将有资格进行垃圾回收。没有伤害。

  

2)性能怎么样?在一堆不同的方法中使用相同的类变量或在相应的方法中创建局部变量是否更快?

我希望期望局部变量的行为稍微快一些 - 但是任何性能差异几乎肯定都是微不足道的(可能是不可测量的),并且不应该用于决定什么要做。

只需将它们更改为局部变量即可 - 清理设计。