代码检查:不要对 'using' 变量使用对象初始化器(对象初始化器表达式在初始化 'using' 变量时可能抛出异常)
使用对象初始化器初始化 示意图 变量可能会出现问题,如果在初始化期间抛出异常。 这是可能的,因为编译器在执行进入 示意图 子句之前创建并初始化了对象。 如果在初始化期间抛出异常,程序将永远不会进入 示意图 子句,并且对象不会被释放。
如果任何对象属性使用涉及方法调用的表达式进行初始化,JetBrains Rider 会报告该调用中可能存在异常的问题,并建议引入一个新变量并用该变量替换该调用。 这确保了任何潜在的异常都会发生在新变量的初始化期间,并且 示意图 变量在任何情况下都会被释放。
class MyDisposable : IDisposable
{
public int Prop { get; init; }
public void Dispose()
{
// TODO release managed resources here
}
}
class Test
{
public Test()
{
using (var x = new MyDisposable { Prop = CalculateValue() })
{
Console.WriteLine(x);
}
}
int CalculateValue() => throw new();
}
class MyDisposable : IDisposable
{
public int Prop { get; init; }
public void Dispose()
{
// TODO release managed resources here
}
}
class Test
{
public Test()
{
var calculateValue = CalculateValue();
using (var x = new MyDisposable { Prop = calculateValue })
{
Console.WriteLine(x);
}
}
int CalculateValue() => throw new();
}
在上述示例中,JetBrains Rider 可以访问初始化方法 CalculateValue() 的来源,并检查它是否确实抛出异常。 如果没有,问题将不会被报告。 然而,如果您以这种方式使用任何库方法,JetBrains Rider 将假定可能存在异常并发出警告。
最后修改日期: 2025年 9月 26日