【问题标题】:Compare string to null - Why does Resharper think this is always false?将字符串与 null 进行比较 - 为什么 Resharper 认为这总是错误的?
【发布时间】:2012-07-17 19:41:35
【问题描述】:

我的自定义 MembershipProvider 中有这段代码:

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
    if (config == null)
        throw new ArgumentNullException("config");

    if (name == null)
        name = "MyCustomMembershipProvider";
    ...
}

Resharper 标记了第二个 if 语句并告诉我,它总是会评估为 false。

但是为什么这总是评估为假?我可以轻松地将 null 作为参数传递给方法。

这是一个错误还是 Resharper 就在这里?

PS 1:我使用 Resharper 6.1
PS 2:我知道使用 string.IsNullOrEmpty() 无论如何都是去这里的方式。我只是好奇。

【问题讨论】:

  • 您的课程来自哪个课程?是您的一份还是 .NET 框架的一份?
  • 那是你的完整代码吗?我正在使用 ReSharper 6.1,但没有收到该指示。
  • 我来自 MembershipProvider(在 System.Web.Security 中)
  • ProviderBase.Initialize 当name 为null 时也会抛出ArgumentNullException(如果为空则抛出ArgumentException)。所以我认为 Resharper 知道这一点,并认为孩子不应该限制较少。

标签: c# .net string resharper membership-provider


【解决方案1】:

很可能,参数name 被标记为[NotNull]。 Resharper 附带常见 BCL 类的合同元数据。

【讨论】:

  • 有什么理由会这样标记这个方法参数吗?这是一个公共方法,什么会阻止任何人使用空参数调用它?
  • 合约元数据并不意味着 100% 准确。这意味着务实。我认为这是一件好事。
  • 有趣的是,尽管有 [NotNull] 代码合同,ProviderBase 还对名称进行 NULL 检查。
  • 这是否意味着基类中virtual方法的声明用一个名为[NotNull]的属性装饰了第一个参数?或者在哪里指定了[NotNull]?
  • 我不知道。当然,它不在 mscorlib.dll 中,因为它是由 Microsoft 提供的。必须是 R# 附带的一些外部文件。 R#可以随心所欲地获取元数据,不需要按照csc.exe的规则来玩。
猜你喜欢
  • 2022-06-25
  • 2016-12-22
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2015-07-12
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多