gpt4 book ai didi

c# - 好奇的 C# 使用语句扩展

转载 作者:IT王子 更新时间:2023-10-29 04:19:01 27 4
gpt4 key购买 nike

我运行 ildasm 发现:

    using(Simple simp = new Simple())
{
Console.WriteLine("here");
}

生成等同于此的 IL 代码:

    Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
if(simp != null)
{
simp.Dispose();
}
}

问题是为什么它在 finally 中检查 null?只有执行 try block 时才会执行 finally block ,并且只有在 Simple 构造函数成功(即不抛出异常)时才会执行 try block ,在这种情况下 simp 将是非空的。 (如果担心在 Simple 构造函数和 try block 的开头之间可能会出现一些干预步骤,那么这确实是一个问题,因为可能会抛出一个异常,从而阻止 finally block 的执行。)那么,到底为什么?

抛开(请)使用语句是否比 try-finally 更好的争论,我将我的 try-finally block 写成:

    Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
simp.Dispose();
simp = null; // sanity-check in case I touch simp again
// because I don't rely on all classes
// necessarily throwing
// ObjectDisposedException
}

最佳答案

不,finally block 总是会被执行。您可能不是从 new 中获取对象,而是从返回您的对象的其他函数中获取对象 - 它可能返回 NULL。 using() 是你的 friend !

dss539 非常友好地建议我包括他的注释:

using(Simple simp = null) 

是扩展必须首先检查 null 的另一个原因。

关于c# - 好奇的 C# 使用语句扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946999/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com