我没有看到代码分析规则csharp_prefer_simple_using_statement,也就是“使用简单的‘使用’语句(IDE0063)”产生预期的输出。我向项目中的一个方法添加了一些虚拟代码,如下所示:
using (var file = Image.FromFile(userName))
{
System.Diagnostics.Debug.Assert(file != null);
}VS 2022中的..sln风格解决方案包括几个..csproj风格的项目(即“旧方式”)。我有一个与我的.editorconfig文件夹相同的.sln文件,许多其他内置的.NET分析器和Roslynator分析器工作得很好。
在.editorconfig中,我有csharp_prefer_simple_using_statement = true:warning,我还添加了dotnet_diagnostic.IDE0063.severity = warning作为一个很好的度量。我反复检查了配置中其他地方都没有复制,解决方案/项目文件夹中也没有其他.editorconfig文件。
尽管我知道它应该被.editorconfig文件取代,但我在VS选项中找到了相同的设置,并在那里启用了它:

我还打开了项目文件(C# 10 / .NET 6最新版本,顺便说一句),并设置了<AnalysisLevel>latest-recommended</AnalysisLevel>。
我已经清理了构建、重新启动VS和重建,我仍然在输出、错误列表或编辑器中看不到任何提示简化using语句的内容。同样,我还有许多其他代码分析规则,产品输出都位于编辑器和构建输出&错误列表中。
请问我哪里出问题了?
编辑:@Guru的问题勾起了我的嗅觉,我发现虽然这里的第一种方法不会产生IDE0063,但是后者会产生。为什么?
public Stream GenerateReport()
{
using (var reportContext = new ReportRenderContext(this.ReportTemplate))
{
reportContext.Render();
}
return this.FileStream;
}
public static int GetAreaOfImage(string fileName)
{
using (var image = Image.FromFile(fileName))
{
return image.Size.Width * image.Size.Height;
}
}发布于 2022-07-04 08:32:21
using declaration基于作用域工作,资源将在作用域的末尾释放,所以下一个:
public Stream GenerateReport()
{
using (var reportContext = new ReportRenderContext(this.ReportTemplate))
{
reportContext.Render();
}
return this.FileStream;
}不等同于:
public Stream GenerateReport()
{
using var reportContext = new ReportRenderContext(this.ReportTemplate);
reportContext.Render();
return this.FileStream;
}后者类似于:
public Stream GenerateReport()
{
using (var reportContext = new ReportRenderContext(this.ReportTemplate))
{
reportContext.Render();
return this.FileStream;
}
} 这在某些情况下可能有差异,因此由于这个编译器不会产生警告(编译器非常聪明,同时非常愚蠢,它并不“真正”知道this.FileStream做什么。例如,它可以访问与ReportRenderContext相同的资源(比如一些不可共享的文件),并在return this.FileStream引入运行时错误后进行处理。或者this.FileStream只是一个相对较长的操作,Dispose的主要目的之一是在不需要资源时立即释放它们。有“反向”的例子,当第二个片段可以修复一个"bug“-在async context中)。
https://stackoverflow.com/questions/72852115
复制相似问题