【问题标题】:Ensure property can't return null [closed]确保属性不能返回 null [关闭]
【发布时间】:2011-12-27 09:14:40
【问题描述】:

在 C# 中是否有可能从 MSDN 文档中知道某些方法/属性/字段可以或不可以返回 null 值?

例如Image.RawFormat MSDN 的属性说:

表示此 Image 的文件格式的 ImageFormat。

它可以返回null吗?我应该在我的代码中执行这样的空检查还是它总是不为空?

【问题讨论】:

标签: c# .net documentation null msdn


【解决方案1】:

我相信对于任何 input 值(即不是由您的代码提供),您都应该执行验证检查。即使您在 MSDN 中看到它现在无法返回 null,但将来可能会发生变化,无论如何这是一个好习惯。

【讨论】:

  • 但如果我这样做,我会得到更低的代码覆盖率!不要?
  • 我想念在这个线程中使用“较低的代码覆盖率”。据我所知,这句话是指您对代码所做的测试级别。比如“你涵盖了多少种可能的场景?”。无论如何,它会让你的代码更安全。唯一的缺点是你会损失性能,但它可能太低以至于无法衡量。
  • 是的,你正确地理解了我。当我运行一些代码覆盖率工具时,它会测量我的代码测试的好坏(使用一些 xUnit 框架) - 因此,如果我有永远不会被调用且因此无法用于测试的死代码,我将失去一些覆盖率。
  • 我不确定这个特定的测试做什么和测量什么。但是对你来说更重要的是什么?这个测试的分数还是你的代码的健壮性?
  • 两者都有!并且检查 null 不是很好的设计,这会使代码变脏?你不觉得吗?
【解决方案2】:

我不认为有一种保证的方式可以从文档中看出,但它通常会说它是否可以为空。例如,如果您查看 System.Windows.Documents.Inline.NextInline 的文档,它会说:

表示下一个 Inline 元素的 Inline 对象,该元素是对等点 到这个元素,如果没有下一个 Inline 元素,则返回 null。

无论如何,如果您的程序无法处理 null 值并且您有一个引用类型的实例,您仍然应该对 null 进行适当的验证。

【讨论】:

  • 遗憾的是,您所说的有关 MSDN 的内容并不总是适用。以msdn.microsoft.com/en-us/library/… 为例。当然,在非 WPF 应用程序中该属性为 null 是有道理的,但没有明确说明。
  • @MatějZábský:是的,不保证文档对此是明确的。似乎如果它“重要”(或常见)足以提到 null 的可能性,它就会在那里。
【解决方案3】:

Resharper 会在您使用无法证明不为 null 的对象时发出警告(例如,通过查看 NotNull 属性,或通过查看被调用的方法自己进行检查) - 然后不显眼地让您添加点击一两下即可查看。

这样您可以避免在不必要的情况下使用检查乱扔代码。

此外,经常使用Debug.Assert 就足以进行“不太可能但假设”检查(无论如何,您必须终止代码正在执行的任何操作)。

【讨论】:

  • 即使是 c# 编译器也会警告你,例如int i = null.
  • 但它不会在像“object o = null; str s = o.ToString()”这样的情况下警告你,这是 OP 所要求的。
【解决方案4】:

没有办法确保可空类型不会返回null,但是考虑到框架在代码更改方面是稳定的,我倾向于通过查看属性或方法的方式来做出明智的决定正在使用ILSpyJustDecompile 调用作品。

在您的示例中,似乎无法返回 null,因为 ImageFormat 的构造函数接受 Guid 并将其分配给私有字段。

根据您对该属性的处理情况,可能值得检查:

  1. 访问该属性时不会抛出StatusException
  2. ImageFormat 等于您所期望的格式,因为它可能表示 GdiPlus 或 .NET 都不“知道”的图像格式。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多