我正在研究一些代码示例,并且看到了与以下示例相似的变体,其中之一使我感到非常好奇。
在goto_tag
语句之前放置try
时。这完全有道理,并且只再次遍历try
。
retry_tag: //the goto tag to re-attempt to copy a file
try {
fileInfo.CopyTo( toAbsolutePath + fileInfo.Name, true ); //THIS LINE MIGHT FAIL IF BUSY
} catch {
Thread.Sleep(500); //wait a little time for file to become available.
goto retry_tag; //go back and re-attempt to copy
}
但是,当我看到以下内容时,我不明白。将goto_tag
放在try
语句中并从catch
块中调用时。
try {
retry_tag: //the goto tag to re-attempt to copy a file
fileInfo.CopyTo( toAbsolutePath + fileInfo.Name, true ); //THIS LINE MIGHT FAIL IF BUSY
} catch {
Thread.Sleep(500); //wait a little time for file to become available.
goto retry_tag; //go back and re-attempt to copy
}
try
块是否已复活?还是两个示例在功能上完全相同,或者这是完全非法的操作,甚至无法编译?
这完全是出于好奇,当然,如果有其中一个,我当然更喜欢第一个示例。
感谢您的见解!
答案 0 :(得分:2)
要实际回答您的问题:
不,这些不相同。
第一个示例将编译;第二个是非法的。
(关于是否应该像这样编写代码的问题是另一个问题……当然,如果可以帮助,则不应这样做。)
答案 1 :(得分:1)
您可以实现简单的while
而不是goto
:
// loop until ...
while (true) {
try {
fileInfo.CopyTo(Path.Combine(toAbsolutePath, fileInfo.Name), true);
// ... file copied
break;
}
catch (IOException) {
Thread.Sleep(500); //wait a little time for file to become available.
}
}