Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否使用语句或函数exit来处置/终止资源?_.net - Fatal编程技术网

.net 是否使用语句或函数exit来处置/终止资源?

.net 是否使用语句或函数exit来处置/终止资源?,.net,.net,我是否应该一直使用这种做法 Public Function DoWork() Using dc as New myDataContext() ... End Using End Function 或者仅仅是退出函数就足够了,然后做同样的事情 Public Function DoWork() Dim dc as New myDataContext() ... End Function 在处理DataContext资源方面,退出End

我是否应该一直使用这种做法

Public Function DoWork()

    Using dc as New myDataContext()

        ...

    End Using

End Function
或者仅仅是退出函数就足够了,然后做同样的事情

Public Function DoWork()

    Dim dc as New myDataContext()

    ...

End Function

在处理DataContext资源方面,退出End函数是否与End Using相同?

它们完全不同

如果对象实现了,那么您应该始终以处理它为目标-最简单的方法是将其包装在块中


(如果该对象没有实现,那么即使您愿意,也无法处理或使用它。)

它们完全不同

如果对象实现了,那么您应该始终以处理它为目标-最简单的方法是将其包装在块中

(如果该对象未实现,则即使您希望,也无法处置或使用它。)

该语句的目的是对实现的对象进行调用。手动方式是一个
try…finally
语句,但这要难看得多

退出该函数不会调用
Dispose
。局部变量超出范围,不再引用对象。对象不再具有引用不会立即引起反应。这只是意味着GC可以从现在开始收集它

因此,本地资源将一直保留,直到GC收集它们为止,可能要晚得多。或者,如果在
Dispose
中存在对该对象的其他引用,则该对象可能根本不会被收集

在C#(VB.net应该非常类似)
中,在引用类型上使用
对应于:

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}
正如您所看到的,
finally
负责调用dispose,而不管
语句中发生了什么。即使退出函数或抛出异常,也会执行Finally。
只有一些灾难性错误,如OutOfMemory、StackOverflow和强制应用程序域卸载,将无法执行该语句。

该语句的目的是在实现的对象上调用。手动方式是一个
try…finally
语句,但这要难看得多

退出该函数不会调用
Dispose
。局部变量超出范围,不再引用对象。对象不再具有引用不会立即引起反应。这只是意味着GC可以从现在开始收集它

因此,本地资源将一直保留,直到GC收集它们为止,可能要晚得多。或者,如果在
Dispose
中存在对该对象的其他引用,则该对象可能根本不会被收集

在C#(VB.net应该非常类似)
中,在引用类型上使用
对应于:

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}
正如您所看到的,
finally
负责调用dispose,而不管
语句中发生了什么。即使退出函数或抛出异常,也会执行Finally。

只有一些灾难性的错误,如OutOfMemory、StackOverflow和强制应用程序域卸载将无法执行它。

我从未在.NET中编程,但我知道答案,因为该主题每周出现三次。一个普通的.NET程序员对他的语言知之甚少吗?我从来没有用.NET编程过,但我知道答案,因为这个话题每周会出现三次。普通的.NET程序员对自己的语言知之甚少吗?这可能会导致内存不足或连接池超时。这可能会导致内存不足或连接池超时。当您处于函数内部的Using块中,并且需要在For/Next循环或什么?使用
块的
将为您处理这种情况。它基本上转化为一个
try…finally
,其中
finally
块将确保在对象上调用
Dispose
。@eden机器为什么会出现问题?当您使用
语句离开
的作用域时,即使您从函数返回或抛出异常,对象也将被释放。它只在发生灾难性故障(OutOfMemory,…)时才会执行。例如,这是否违背了使用的目的?公共函数GetAllUsers()作为IList(用户的),使用dc作为新的myDataContext()返回(从dc.Users中的u返回)。ToList()使用结束函数结束代码非常好。它创建并填充列表,然后处理数据上下文。当您处于函数内部的Using块中,并且需要在For/Next循环或其他循环中调用Exit函数时,您将如何处理场景?
Using
块将为您处理该情况。它基本上转化为一个
try…finally
,其中
finally
块将确保在对象上调用
Dispose
。@eden机器为什么会出现问题?当您使用
语句离开
的作用域时,即使您从函数返回或抛出异常,对象也将被释放。它只在发生灾难性故障(OutOfMemory,…)时才会执行。例如,这是否违背了使用的目的?公共函数GetAllUsers()作为IList(用户的),使用dc作为新的myDataContext()返回(从dc.Users中的u返回)。ToList()使用结束函数结束代码非常好。它创建并填充列表,然后处理数据上下文。