【问题标题】:How does visual studio (or Resharper ?) know that "Expression is always true"? [duplicate]视觉工作室(或 Resharper ?)如何知道“表达总是正确的”? [复制]
【发布时间】:2014-06-26 07:06:41
【问题描述】:

将 Visual Studio 2012 与 Resharper 结合使用。

示例代码:

    public void DoSomethingWithTable(DataTable dt)
    {
        if (dt.PrimaryKey != null) // XX
        {
            // do something
        }
    }

在 IDE 中,我在标记为 XX 的行处收到警告:“表达式始终为真”。我的问题是,IDE(或 Resharper ?)如何知道 PrimaryKey 的 DataColumn[] 值不会为 null ?

我知道如果我使用 Reflector 这样的工具来查看 ADO.NET 的内部工作原理,我可以得出相同的结论,但是 Resharper 是如何做到的呢?这样的警告是否 100% 可靠?

【问题讨论】:

  • 对不起,重复。知道这些警告是否 100% 可靠吗?
  • 没有什么是 100% 可靠的,但我自己相信 ReSharper 在这些方面。 ReSharper 不会标记这一点,除非它“确定”这一点,所以总的来说我会说是的,你可以相信这一点。但是100%可靠吗?你的意思是,这段代码完全没有错误?没有人是那么完美。 Jetbrains 的人很好,但他们的代码也有错误。不过,我还没有看到这个特定警告的问题。我的建议:去做吧

标签: c# visual-studio-2012 ado.net resharper


【解决方案1】:

我没有反射器,也许它使用了反编译器?

确实不可能是null,这是通过ILSpy反编译的:

public DataColumn[] PrimaryKey
{
    get
    {
        UniqueConstraint uniqueConstraint = this.primaryKey;
        if (uniqueConstraint != null)
        {
            return uniqueConstraint.Key.ToArray();
        }
        return DataTable.zeroColumns;
    }
        // setter ...

// System.Data.DataTable
internal static readonly DataColumn[] zeroColumns = new DataColumn[0];

编辑:如duplicate 中所示,resharper 将NotNullAttribute 用于 .NET 或 NUnit 框架中的类。

我们分析了很大一部分 .NET Framework 类库,如 以及 NUnit 框架,并通过外部 XML 文件对其进行注释, 使用 JetBrains.Annotations 中的一组自定义属性 命名空间....

【讨论】:

  • ReSharper 使用外部注释库(通过审查/分析 .NET 框架创建),但不执行交叉组装(或外部解决方案)分析。
  • @user2864740:是的,我也只是阅读了重复问题的已接受答案。但也许这个答案还是有帮助的,因为即使没有NotNullAttribute(在当前程序集中),resharper 也会尝试找到答案。我已经编辑了我的答案以包含它。
猜你喜欢
  • 2011-07-01
  • 2016-04-26
  • 2013-04-19
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2018-07-24
  • 2019-08-27
  • 1970-01-01
相关资源
最近更新 更多