Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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
C# 为什么对空的try块使用try{}finally{}?_C#_.net - Fatal编程技术网

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();
}