c# - 为什么/optimize 在 C# 项目中生成比未启用此功能更多的代码分析警告?

标签 c# optimization code-analysis

我们有一个项目,我们使用 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/

相关文章:

mysql - 如何使用多个连接和子查询优化这个慢速查询

c - 为 Core 2 或 Core i7 架构完全优化的 memcpy/memmove?

c# - 使用 AdHocWorkspace 结果为 "The language ' C#' is not supported."

c# - 如何识别在 C# 中的给定方法中读/写了哪些状态变量

C# 屏蔽文本框

从两个列表中选择最佳组合的算法

c# - 如何让 ReportViewer 显示多页(例如每个 DataRow 显示一页)?

msbuild - 您可以从msbuild.exe命令行关闭条件编译符号吗?

c# - 使用 MVVM 模式中的 DXGrid 绑定(bind)/编辑数据的最佳选择是什么?

c# - 在功能区中使用 .ico 图像