【问题标题】:Is generic list construction ignored if the instance already exists?如果实例已经存在,是否会忽略通用列表构造?
【发布时间】:2016-07-13 18:34:48
【问题描述】:

我有这个代码:

if (null == _priceComplianceSummaryList)
{
    _priceComplianceSummaryList = new List<PriceComplianceSummary>();
}

Resharper 将其标记为问题,建议“用相应的分支替换 'if' 语句”如果我默认,上面的代码将更改为:

_priceComplianceSummaryList = new List<PriceComplianceSummary>();

然而,R# 似乎更像是“猫”的腰带和吊带类型,敦促我在引用它之前总是检查某些东西是否为空。那么,这种表面上鲁莽的行为真的只是效率问题吗? IOW,“new List”是否仅在 istance 变量 (_priceComplianceSummaryList) 为空时才生成新列表,而无需明确检查?

【问题讨论】:

  • "IOW,new List&lt;&gt; 是否仅在 istance 变量为 null 时才生成新列表,而无需明确检查?"不,它没有。
  • 我能看到 R# 建议这样做的唯一原因是因为它可以确定 _priceComplianceSummaryList 在您进行此检查时始终为空,例如您在构造函数中,并且没有对该字段进行静态初始化,从而使检查变得多余。在实例化 List&lt;T&gt; 时,new 关键字没有什么特别之处 - 在赋值之后 _priceComplianceSummaryList不会 成为 null,无论它之前有什么(如果有的话)值,都可以null 与否,将不再有。
  • 你能显示你定义这个变量的代码吗?另外,变量的范围是什么?请显示所有相关代码。
  • @YacoubMassad:现在它就在那里:var _priceComplianceSummaryList = new List();所以我想那时它不可能是空的。

标签: c# resharper generic-list branch-prediction object-construction


【解决方案1】:

“用相应的分支替换'if'语句”R# 建议意味着当您的布尔表达式返回false 时,不存在任何场景。例如,

void SomeMethod(bool firstParam)
{
    var secondParam = true;
    if (firstParam || secondParam)
    {
        Console.WriteLine();
    }
}

此代码将通过 R# 重构,因为 firstParam || secondParam 始终为真。

然后,您的 2 个代码示例并不总是等价的,但在您的场景中它们是等价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多