关于c#:string.Empty可以等于null吗?

Can string.Empty ever be equal to null?

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

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

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

注意:这是源代码,如果您有兴趣查看


根据msdn:

1
String .Empty ==""

从referencesource.microsoft.com:

1
2
3
4
5
// 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可能表示"执行引擎"。)

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


可以吗?对。

那行代码能告诉你是不是?不可靠。一旦打破运行时的不变量,所有代码的行为就变得不可靠。

此行更可能成功执行测试,但仍无法保证:

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


在正常环境中,这种情况(或者更好地说,应该)永远不会发生(除了运行时的错误,或者有人干扰反射),因为指定string.Empty等于""

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


在普通应用程序中,不,string.empty不能为空。

异常消息似乎表明,开发人员认为编译器是初始化字符串的工具。不过,对于Atomos来说是空的,这没有意义…空字符串由静态构造函数在运行时初始化,而不是在编译时初始化。

我不知道在Atomos中string.empty是否可以为空,但一般来说,除非System.String的运行时或实现有问题,否则不可能。


根据标准,不,string.Empty不应为空。

然而,这可能使用一个定制的C编译器来编写操作系统。我想这个测试在单元测试中会更好,但那只是我自己。