在需要时在类或方法级别声明重用变量

时间:2009-10-08 22:36:14

标签: c#

RAII适用于C#吗?更具体地说,在声明变量时,在声明在类级别的不同方法中使用的变量(我做什么但不是线程安全)之间或者在每个方法级别声明/实例化它几次之间是否存在任何差异是否需要然后超出范围?

例如,SqlConnection对象可以在类的不同方法中使用 - 它应该在顶层/类级别声明还是在每个方法中单独声明?

class Test
{
   SqlConnection conn;
   ....

在使用块中实例化,然后以几种不同的方法超出范围。

或者...

public void A()
{
  SqlConnection conn = new SqlConnection();
}

同样有几种方法。

由于

3 个答案:

答案 0 :(得分:2)

应该在正确的地方宣布。

如果方法之间没有实际共享,则它应该是方法的内部 - 无论20个方法是否需要连接对象。你不要在你的类中创建一个单独的lp变量,因为有几个方法需要做循环(这不是FORTRAN)。

是的,内部完全不同。

答案 1 :(得分:0)

RAII对C#等内存管理语言的适用方式不同。维基百科文章主要适用于C ++。 Java部分更合适。

对于C#中的非托管资源,请查看Dispose Pattern

编辑:SqlConnection实现了IDisposable,因此您需要执行以下操作之一:

  • 将其设置为本地并使用使用块
  • 立即处理
  • 将其设为班级的字段并在班级上实施Dispose Pattern
  • 将一个实例传递给您的班级并让调用者负责处理它
  • 某些类/方法负责处理它的其他技术

答案 2 :(得分:0)

存在差异:(通常,在需要的地方声明)

对于引用类型:当conn变量超出范围时,sql连接符合垃圾回收的条件。所以,在第一个例子中,如果你在完成后没有处理/ null conn,你将保持你的连接实例,即使你没有使用它。

对于值类型:(整数,结构等) 局部变量在堆栈上分配,但如果在类级别声明它,则使用堆内存。

你可以想象降低垃圾收集器的效率 - 如果你在类级别分配了很多对象,并且将它们保持的时间比你需要的时间长,那么它们更有可能进入第2代。您可以(令人信服地)处于您的(廉价)第0代收藏不满足的位置,并且运行时开始执行更多第2代收藏(昂贵)

除此之外,在他们使用它们的地方进行delcare是一种很好的做法。它使代码更容易理解,并减少由副作用引起的错误的可能性。