我们有一个项目,我们使用 StyleCop 和代码分析来验证代码的结构。我们已经为这两种机制设置了将警告视为错误。
然而,我们发现了一种我们无法解释的奇怪行为。我们有调试和发布配置。在我们的调试配置中,我们没有收到一个 CA 警告,而在我们的发布配置中收到此警告。我们开始研究这 2 个配置之间的差异,我们发现优化复选框是我们在发布期间而不是在调试期间收到此警告的原因。
我们有下面的配置。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
当我们将调试的优化值设置为 true 时,我们也会收到 CA 警告。当我们将其设置为 false 时,警告消失了。这也仅适用于警告 CA1806 .无论优化值如何,其他 CA 警告都会正确显示。
触发此警告的代码是下面的代码。这只是测试代码,但它模拟了我们遇到的真实情况。已分配默认值但从未在任何代码中使用的变量。
public CourseService(IOrtContext context)
{
this.context = context;
var defaultDate = new DateTime(1900, 1, 1);
}
那么,有人知道为什么显示 CA1806 取决于是否启用优化吗?
最佳答案
我相信这是因为优化器完全忽略了对 defaultDate
的赋值。
在 Debug模式下,一个新的 DateTime
被实例化并分配给 defaultDate
局部变量:
var defaultDate = new DateTime(1900, 1, 1);
赋值被视为对 DateTime
实例的“使用”,因此不会引发 CA1806
,即使 defaultDate
随后未引发用过。
另一方面,优化器在 Release模式下省略了赋值(和局部变量):
/* var defaultDate = */ new DateTime(1900, 1, 1);
因此 DateTime
实例不再被视为“已使用”,并且引发了 CA1806
。
关于c# - 为什么/optimize 在 C# 项目中生成比未启用此功能更多的代码分析警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976417/