【问题标题】:Can string.Empty ever be equal to null?string.Empty 可以等于 null 吗?
【发布时间】:2014-07-29 17:52:37
【问题描述】:

我发现了一个用C# 编写的开源操作系统的代码,我看到了以下检查:

if (String.Empty == null)
     throw new Exception("Compiler didn't initialize System.String.Empty!");

这对我来说似乎是一个毫无意义的检查,但因为我在 操作系统的源代码中看到它,我想我可能遗漏了一些东西。 string.Empty 是否有可能为 null

注意:这里是source code,如果您有兴趣查看

【问题讨论】:

  • 有些人只想看到世界燃烧

标签: c# string


【解决方案1】:

根据MSDN

String .Empty == ""

来自referencesource.microsoft.com

// The Empty constant holds the empty string value. It is initialized by the EE during startup.
// It is treated as intrinsic by the JIT as so the static constructor would never run.
// Leaving it uninitialized would confuse debuggers.
. . . .
public static readonly String Empty;

(EE 可能意味着“Execution Engine”。)

当然,可能是某些 CLR 实现不遵循此规则,或者有人设法使用反射打破了它。但如果我们考虑这种情况,那么答案应该接近“一切皆有可能”。

【讨论】:

    【解决方案2】:

    可以吗? Yes.

    那行代码会告诉你它是否存在吗?不可靠。一旦破坏了运行时的不变量,所有代码的行为就会变得不可靠。

    这一行更有可能成功执行测试,但仍不能保证:

    if (ReferenceEquals(null, typeof(string).GetField("Empty").GetValue(null)))
    

    【讨论】:

      【解决方案3】:

      正常环境中,这可能(或者更好地说应该)永远不会出现这种情况(除了运行时中的错误,或者有人搞乱反射),因为String.Empty 被指定为等于""

      由于您所指的项目 (AtomOS) 使用 IL2CPU 将 IL 代码转换为本机机器指令,这可能用于捕获 IL2CPU 中的错误。

      【讨论】:

      • 当然,该行有资格优化为if (false),然后它不会捕获任何错误。 (事实上​​,我们已经看到 if (x == String.Empty) 在某些版本的 CLR 上被优化为 if (x != null && x.Length == 0)
      • 实际上可能是 Mono 进行了优化。无论如何,不​​同的运行时对此采取不同的行动。
      【解决方案4】:

      根据标准,不,string.Empty 永远不能为空。

      但是,这可能使用自定义 C# 编译器来编写操作系统。我认为这个测试在单元测试中会更好,但这只是我。

      【讨论】:

        【解决方案5】:

        在正常的应用程序中,不,String.Empty 永远不能为空。

        异常消息似乎表明开发人员认为编译器是为 AtomOS 初始化 String.Empty 的原因,但这没有任何意义...... String.Empty 在运行时由静态构造函数初始化,而不是在编译时.

        我不知道 String.Empty 在 AtomOS 中是否可能为 null,但一般来说,除非 System.String 的运行时或实现有问题,否则这是不可能的。

        【讨论】:

        • "String.Empty 在运行时由静态构造函数初始化" 不确定,它可能是 JIT 内在函数。 (见我的帖子。)
        猜你喜欢
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        相关资源
        最近更新 更多