代码检查:不要对 'using' 变量使用对象初始化器
如果在初始化期间抛出异常,使用对象初始化器初始化 using 变量可能会成为问题。 这是可能的,因为编译器会在执行进入 using 子句之前创建并初始化对象。 如果在初始化期间抛出异常,程序将永远不会进入 using 子句,并且对象将不会被释放。
ReSharper 会报告此类情况,并建议将初始化转换为简单赋值,并将属性的初始化移到 using 块中:
class MyDisposable : IDisposable
{
public int Prop { get => throw new(); set => throw new(); }
public void Dispose()
{
// TODO release managed resources here
}
}
class Test
{
public Test()
{
using (var x = new MyDisposable { Prop = 1 })
{
Console.WriteLine(x);
}
}
}
class MyDisposable : IDisposable
{
public int Prop { get => throw new(); set => throw new(); }
public void Dispose()
{
// TODO release managed resources here
}
}
class Test
{
public Test()
{
using (var x = new MyDisposable())
{
x.Prop = 1;
Console.WriteLine(x);
}
}
}
在上述示例中,ReSharper 可以访问对象类 MyDisposable 的来源,并检查其任何属性是否实际抛出异常。 如果没有,则不会报告问题。 但是,如果您以这种方式初始化任何库类,ReSharper 将假定可能会发生异常并发出警告。
最后修改日期: 2025年 9月 27日