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

本文关键字:类变量 实例化 成员 | 更新日期: 2023-09-27 18:20:37

我在看别人的代码,想知道为什么有人会这么做,以及它在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. 性能如何?在一堆不同的方法中使用像这样的同一类变量,或者在各自的方法中创建一个局部变量,会更快吗?

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

但是上面的代码真的有害处吗?

是的,它扰乱了课堂的状态。看起来这个类实际上不应该有任何状态——这些应该是局部变量。然而,对于偶然的观察者来说,这似乎是与对象相关联的真实状态。

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

实例变量不是"实例化"的,它们只是被赋值的。一旦覆盖了以前的值,如果没有其他内容引用旧值引用的对象,则该对象将有资格进行垃圾回收。没有伤害。

2) 性能如何?在一堆不同的方法中使用像这样的同一类变量,或者在各自的方法中创建一个局部变量,会更快吗?

如果有什么不同的话,我希望局部变量的表现稍微快一点,但任何性能差异几乎肯定都是微不足道的(可能无法测量),不应该用来决定该做什么。

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