Can string.Empty ever be equal to null?
我发现一个开源操作系统的代码是用
1 2 |
对我来说,这似乎是一个毫无意义的检查,但由于我在操作系统的源代码中看到了它,我想我可能遗漏了一些东西。有没有可能
注意:这是源代码,如果您有兴趣查看
根据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 |
在正常环境中,这种情况(或者更好地说,应该)永远不会发生(除了运行时的错误,或者有人干扰反射),因为指定
由于您所指的项目(Atomos)使用il2cpu将IL代码转换为本机指令,因此这可能用于捕获il2cpu中的错误。
在普通应用程序中,不,string.empty不能为空。
异常消息似乎表明,开发人员认为编译器是初始化字符串的工具。不过,对于Atomos来说是空的,这没有意义…空字符串由静态构造函数在运行时初始化,而不是在编译时初始化。
我不知道在Atomos中string.empty是否可以为空,但一般来说,除非System.String的运行时或实现有问题,否则不可能。
根据标准,不,
然而,这可能使用一个定制的C编译器来编写操作系统。我想这个测试在单元测试中会更好,但那只是我自己。