在下面的代码中,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
在之前或之后添加冗余的空检查(
check清除错误。myObj.MyProperty!=null
)!一串IsNullOrWhiteSpace
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
扩展方法上的契约注释。然而,在第一个工作示例中,它确实可以识别这些注释,但需要对对象的属性进行显式且冗余的空检查。
我怀疑这是ReSharper 8中的一个bug(特别是@sarel louw给出的答案,它在返回字符串的合同中返回bool)。我刚刚在ReSharper 2016.2中尝试过这个,它根本不标记键
变量-不需要合同注释
。
你能试试吗
[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