RAII适用于C#吗?更具体地说,在声明变量时,在声明在类级别的不同方法中使用的变量(我做什么但不是线程安全)之间或者在每个方法级别声明/实例化它几次之间是否存在任何差异是否需要然后超出范围?
例如,SqlConnection对象可以在类的不同方法中使用 - 它应该在顶层/类级别声明还是在每个方法中单独声明?
class Test
{
SqlConnection conn;
....
在使用块中实例化,然后以几种不同的方法超出范围。
或者...
public void A()
{
SqlConnection conn = new SqlConnection();
}
同样有几种方法。
由于
答案 0 :(得分:2)
应该在正确的地方宣布。
如果方法之间没有实际共享,则它应该是方法的内部 - 无论20个方法是否需要连接对象。你不要在你的类中创建一个单独的lp变量,因为有几个方法需要做循环(这不是FORTRAN)。
是的,内部完全不同。
答案 1 :(得分:0)
RAII对C#等内存管理语言的适用方式不同。维基百科文章主要适用于C ++。 Java部分更合适。
对于C#中的非托管资源,请查看Dispose Pattern。
编辑:SqlConnection实现了IDisposable,因此您需要执行以下操作之一:
答案 2 :(得分:0)
存在差异:(通常,在需要的地方声明)
对于引用类型:当conn变量超出范围时,sql连接符合垃圾回收的条件。所以,在第一个例子中,如果你在完成后没有处理/ null conn,你将保持你的连接实例,即使你没有使用它。
对于值类型:(整数,结构等) 局部变量在堆栈上分配,但如果在类级别声明它,则使用堆内存。
你可以想象降低垃圾收集器的效率 - 如果你在类级别分配了很多对象,并且将它们保持的时间比你需要的时间长,那么它们更有可能进入第2代。您可以(令人信服地)处于您的(廉价)第0代收藏不满足的位置,并且运行时开始执行更多第2代收藏(昂贵)
除此之外,在他们使用它们的地方进行delcare是一种很好的做法。它使代码更容易理解,并减少由副作用引起的错误的可能性。