C# 为什么对空的try块使用try{}finally{}?
我注意到在C# 为什么对空的try块使用try{}finally{}?,c#,.net,C#,.net,我注意到在System.Threading.TimerBase.Dispose()中,该方法有一个try{}finally{}块,但是try{}是空的 将try{}finally{}与空try一起使用有什么价值吗 这是为了防止线程中止中断进程。因为这种方法说: 未执行的finally块在线程中止之前执行 这是因为为了成功地从错误中恢复,您的代码将需要在其自身之后进行清理。由于C#没有C++风格的析构函数,最终和使用块是确保可靠执行此类清理的唯一可靠方法。请记住,使用块由编译器转换为: try
System.Threading.TimerBase.Dispose()
中,该方法有一个try{}finally{}
块,但是try{}
是空的
将try{}finally{}
与空try
一起使用有什么价值吗
这是为了防止线程中止中断进程。因为这种方法说: 未执行的finally块在线程中止之前执行 这是因为为了成功地从错误中恢复,您的代码将需要在其自身之后进行清理。由于C#没有C++风格的析构函数,
最终
和使用
块是确保可靠执行此类清理的唯一可靠方法。请记住,使用
块由编译器转换为:
try {
...
}
finally {
if(obj != null)
((IDisposable)obj).Dispose();
}
在.NET1.x中,最终
块有可能被中止。此行为在.NET2.0中更改
此外,编译器永远不会优化空try
块。来自:
这种方法防止了一个错误
中止调用中断线程
处理。MSDN页,共页
中止表示“未执行”
最后,在
线程被中止”。所以为了
保证您的处理
即使您的线程是
中间有人流产了
在线程上调用Abort,您可以
将所有代码放在finally中
块(另一种方法是写入
“catch”块中的代码以确定
你在“尝试”之前的位置是
被中止中断并从
如果你想的话,就在那里)
为什么不使用?因为直到.NET2才可用。0@RobFonseca-Ensor:因为
Thread.BeginCriticalRegion()
不会阻止线程中止,而是告诉运行时,如果线程中止,则全局状态已损坏,整个appdomain将被终止。@hanpassant:BeginCriticalSection()
在.NET1.x中确实不存在,但没有因果关系,正如您所说的“因为”。事实上,在.NET1.x中,即使是finally
块也可能被线程中止中断。这些机制有不同的用途:在中最终执行工作
可防止中途中止代码,而BeginCriticalSection()
仅向运行时声明全局状态有风险。如果开发人员有时间(true)最后,中止是否会完成,或者从技术上说中止是否会被无限期地忽略?感谢您对使用块的深入了解。@Anton我知道使用是一种最佳实践。但出于模拟的目的,有时需要实现包装器类,并且一次性对象成为私有类变量。如果我们让这个包装器是一次性的,那么GC不是自动处理私有类变量的处理吗?@Ozkan GC不会自动处理任何东西。您需要实现一个终结器,通常调用Dispose(false)代码>@Thorarin抱歉,您在第2144行附近说GC未自动处理(最终确定)System.Diagnostics.Process是错误的:
try {
...
}
finally {
if(obj != null)
((IDisposable)obj).Dispose();
}