如果我有一个使用块,我创建一个对象(例如一个FileStream对象),并且该对象无法创建(返回null,抛出异常等),块中的代码是否仍然执行?< / p>
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
// do stuff with fs here
}
// do more stuff after
如果FileStream构造函数返回null(如果FileStream构造函数总是返回一个有效的对象,让我们只是为了参数说可以返回null),那么代码内部会执行吗?或者它会跳过“在这里用fs做什么”代码?
答案 0 :(得分:13)
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// do stuff with fs here
}
// do more stuff after
相当于:
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
try
{
// do stuff with fs here
}
finally
{
if (fs != null)
{
((IDisposable)fs).Dispose();
}
}
// do more stuff after
所以回答你的问题:
如果FileStream构造函数返回null(如果FileStream 构造函数总是返回一个有效的对象,让我们只是为了说 可以返回null的参数,将代码放在里面 执行?
是的,它会。
显然,每个熟悉C#规范的人都知道构造函数(不管是哪种类型)都可以永远不会返回null
哪种类型会让你的问题变得不切实际。
答案 1 :(得分:0)
异常将照常处理,即通过封闭的try ... catch,如果你有一个或由系统。
答案 2 :(得分:0)
如果它抛出异常,它肯定不会执行。如果没有抛出异常,它将尝试执行该块。虽然如果它返回null,我的猜测是在从内部抛出异常然后退出之前不会走得太远。
答案 3 :(得分:0)
无论如何都会执行代码,因此您需要保护代码免受攻击。以此控制台应用程序为例,WriteLine
将执行。
class Program
{
static void Main(string[] args)
{
using (null)
{
Console.WriteLine("Hello.");
}
}
}