当前位置: 首页 > 知识库问答 >
问题:

Resharper-可能将Null属性指定给not Null属性时出现误报警告

诸葛卜霸
2023-03-14

在下面的代码中,key的最后两个引用由Resharper标记,尽管Resharper应该知道key不会为空。

首先,字符串属性检查为空、空或空白,如果这些条件中的任何一个为真,则跳过该块。扩展方法,ToLowerNullSafe()仅在输入为Null时返回Null,并且这被标记为注释(第二个代码块)。因为我们已经检查了属性是否为非空,并且扩展方法被标记为返回非空,所以我希望Resharper知道key为非空。

var myObj = new { MyProperty = "some string" };
var myCache = new Dictionary<string, object>();

if (!string.IsNullOrWhiteSpace(myObj.MyProperty))
{
    string key = myObj.MyProperty.ToLowerNullSafe();
    lock (myCache)
    {
        if (!myCache.ContainsKey(key))
        {
            myCache.Add(key, myObj);
        }
    }
}

上面这两行是标记键的位置:

if (!myCache.ContainsKey(key))

myCache.Add(key, myObj);

下面是ToLowerNullSafe方法及其注释。

[ContractAnnotation("null => null; notnull => notnull")]
public static string ToLowerNullSafe(this string str)
{
    return string.IsNullOrWhiteSpace(str) ? str : str.ToLower();
}

知道为什么Resharper似乎忽略了注释吗?我该怎么解决呢?

使用:

  • Visual Studio Ultimate 2013更新5

编辑

myObj上的冗余空检查。MyProperty之前或之后添加冗余的空检查(myObj.MyProperty!=null)!一串IsNullOrWhiteSpacecheck清除错误。

if (myObj.MyProperty != null && !string.IsNullOrWhiteSpace(myObj.MyProperty))
{
    string key = myObj.MyProperty.ToLowerNullSafe();
    lock (myCache)
    {
        if (!myCache.ContainsKey(key))
        {
            myCache.Add(key, myObj);
        }
    }
}

键上的冗余空检查添加冗余检查、断言或契约假设也可以清除错误。

这里我添加了合同。假设(key!=null) 键后立即编码>

if (!string.IsNullOrWhiteSpace(myObj.MyProperty))
{
    string key = myObj.MyProperty.ToLowerNullSafe();
    Contract.Assume(key != null);
    lock (myCache)
    {
        if (!myCache.ContainsKey(key))
        {
            myCache.Add(key, myObj);
        }
    }
}

不调用ToLowerNullSafe这也清除了错误。但是,由于ContainsKey方法执行区分大小写的比较,而我希望进行不区分大小写的比较,因此可能会出现问题。

if (!string.IsNullOrWhiteSpace(myObj.MyProperty))
{
    string key = myObj.MyProperty;
    lock (myCache)
    {
        if (!myCache.ContainsKey(key))
        {
            myCache.Add(key, myObj);
        }
    }
}

调用内置字符串函数ToLower也会清除错误。但会使代码库不一致。我们在代码中有许多地方可以预期空值,并且必须安全地处理空值,因此为了避免出现问题,我们应用了custom。。。NullSafe扩展方法贯穿整个代码。我不确定这是否符合“最佳实践”,但这就是我们在这个项目上所做的。

if (!string.IsNullOrWhiteSpace(myObj.MyProperty))
{
    string key = myObj.MyProperty.ToLower();
    lock (myCache)
    {
        if (!myCache.ContainsKey(key))
        {
            myCache.Add(key, myObj);
        }
    }
}

在所有工作代码示例中,Resharper似乎只是忽略了ToLowerNullSafe扩展方法上的契约注释。然而,在第一个工作示例中,它确实可以识别这些注释,但需要对对象的属性进行显式且冗余的空检查。


共有2个答案

任小云
2023-03-14

我怀疑这是ReSharper 8中的一个bug(特别是@sarel louw给出的答案,它在返回字符串的合同中返回bool)。我刚刚在ReSharper 2016.2中尝试过这个,它根本不标记变量-不需要合同注释

严亦
2023-03-14

你能试试吗

[ContractAnnotation("str:null => null; str:notnull=>notnull")]

我在搜索为什么Resharper会这样做,并找到了这个页面,它也可能是Resharper的版本问题?

编辑

我已经实现了与您相同的方法,并且完全根据您的代码创建了扩展方法,当我对注释执行以下操作时,“键”上的曲线消失了。

[ContractAnnotation("null => true; notnull => true")]

希望这有所帮助。

 类似资料:
  • 问题内容: 我有一个属性指令,其限制如下: 我需要传递两个属性;一个数字和一个函数/回调,使用对象在指令中访问它们。 如果指令是元素指令,那么我可以限制为: 但是,出于某种原因,我不再赘述,我需要将该指令作为属性指令。 如何将多个属性传递到属性指令中? 问题答案: 该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素也是如此。 模板: 指示: 如果attribute的值将被硬编码,则

  • 我使用Spring Data Neo4j 4 GraphRepository来保存和检索数据。使用GraphRepository保存()和findAll()方法。 当我将现有实体属性更新为null时,所做的更改似乎不会反映在返回的数据中。 如果将属性更新为任何其他非空值,则更改将正确反映。 我可以看到null属性更新是在DB服务器上执行的。但是findAll()方法不反映更改并保留旧值。 这是已知

  • 我正在尝试使用MapStruct实现实体和DTO之间的映射。要映射的属性之一是“结算日期”。它在DTO类中具有相同的名称,并且映射工作正常,但在编译过程中我收到了以下警告: 有没有办法让MapStruct在没有警告的情况下处理这样一个命名奇怪的属性? 我尝试使用注释来明确指定名称,但这没有帮助:

  • 问题内容: 这是我的代码,直接来自一个类。我的问题是第22行在。 我看不到问题,这是Zend Engine的限制吗?还是我瞎了。 问题答案: 在5.6之前的PHP版本中初始化类属性时,不能使用 非常量值 。 这些是在编译时初始化的,在编译时PHP将不进行任何计算或执行任何代码。是需要评估的表达式,您不能在那里进行评估。可以将其替换为常数,也可以在中进行计算。 2014年推出的PHP 5.6 允许“

  • 出于逻辑测试的目的,我使用了一个可点击的按钮来触发“source.inject()”。代理的前面逻辑取决于代理的特性。因此,当测试模型逻辑时,最好控制它们在启动期间获得哪些特性。在源块的inject()-函数上搜索AnyLogic文档并没有显示出任何强制初始特性的方法。 我尝试使用“add_patients();”这允许创建代理,并且我可以随意指定括号内的特性。但是,如果我使用此函数,代理将不会进

  • 问题内容: 使用@jit装饰器运行代码时出现错误。似乎无法找到函数scipy.special.gammainc()的某些信息: 没有@jit装饰器,代码将正常运行。也许需要一些使scipy.special模块的属性对Numba可见的东西? 在此先感谢您的任何建议,评论等。 问题答案: 问题在于这不是Numba固有的一小部分函数(请参阅http://numba.pydata.org/numba- d