【问题标题】:Extension method to check for null Guid? makes ReSharper complain检查空Guid的扩展方法?让 ReSharper 抱怨
【发布时间】:2013-08-14 00:01:53
【问题描述】:

我创建了一个扩展方法来避免像下面的“if”这样键入代码:

Guid? nullableGuid = something;

if (!nullableGuid.HasValue || nullableGuid == Guid.Empty)
{
    // do stuff
}
else
{
    // do other stuff
}

我的扩展方法是:

public static bool IsNullOrEmpty(this Guid? g)
{
    return !g.HasValue || g.Value == Guid.Empty;
}

这很好,因为现在我的代码看起来更干净并且更易于阅读:

Guid? nullableGuid = something;

if (nullableGuid.IsNullOrEmpty())
{
    // do stuff
}
else
{
    // do other stuff
}

问题是,如果我尝试在 else 块中使用 Guid,resharper 会抱怨。它没有意识到我在扩展方法中检查了 HasValue。当然,我可以使用 cmets 抑制警告或更改 resharper 选项,但这些都不是好的选择。如果我必须在任何地方评论代码,它往往会破坏首先使代码更清晰的目的。如果我更改 resharper 选项,那简直太疯狂了。

我想知道是否有更好的选择。有没有办法“告诉” resharper 它是“好的”,而不必在任何地方评论代码或禁用检查?

【问题讨论】:

  • 我不明白 Resharper 是如何知道您在该扩展方法中进行空检查的。如果您确实找到了解决方案,我很想知道它是什么。
  • 显示您在问题中所述的代码我没有看到 GUID 在您提供的任何 else 语句中使用,请显示所有相关代码
  • @JoeBrunscheon,你可能是对的。我希望有人知道我还没有找到的功能。

标签: c# resharper


【解决方案1】:

您可以通过合同注释“告诉”Resharper。 http://blogs.jetbrains.com/dotnet/2012/08/contract-annotations-in-resharper-7/

来自该链接的示例:

[ContractAnnotation("s:null => true")]
public bool IsNullOrEmpty(string s)

据此,我将收集以下内容可以为您解决问题:

[ContractAnnotation("g:null => true")]
public bool IsNullOrEmpty(this Guid? g)

更新:

如果您实际上不想依赖于 Jetbrains 注释程序集,我认为您可以在外部定义合同,请参阅http://blogs.jetbrains.com/dotnet/2010/11/resharper-nullreferenceexception-analysis-and-its-contracts/ 了解更多详细信息以及一般 JetBrain 合同。

【讨论】:

  • 老兄,太棒了。谢谢!
  • 感谢您的更新。我可以理解不想要依赖,但在这种情况下,我并不太担心。很高兴摆脱波浪线!
【解决方案2】:

我想有时您必须忽略一些 ReSharper 警告。 或者您使用项目设置并将其设置为提示(例如)。 但这很烦人。 如果您从事团队项目,我不希望隐藏任何 ReSharper 警告。

【讨论】:

  • 确实很烦人。是的,正是出于这个原因,我已经“降级”了一些东西来暗示。但我喜欢 ReSharper,如果没有它,我永远不会写代码!
  • 我感受到了你的痛苦。我也可以建议使用 CTRL + ALT + SHIFT + 8 暂时禁用 ReSharper。有时阅读代码会更好。尤其是当你阅读别人的代码时。
猜你喜欢
  • 2018-01-19
  • 2012-03-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2019-10-22
相关资源
最近更新 更多