我发现了一个用C#
编写的开源操作系统代码,我看到了以下检查:
if (String.Empty == null)
throw new Exception("Compiler didn't initialize System.String.Empty!");
对我来说这看起来像一个毫无意义的检查但是因为我在操作系统的源代码中看到它,我想我可能会遗漏一些东西。 string.Empty
是否可能 null ?
注意:如果您有兴趣,请参阅source code
答案 0 :(得分:4)
根据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实现不遵循此规则,或者有人设法使用Reflection来破坏它。但如果我们考虑这样的情况,那么答案就应该接近“一切皆有可能”。
答案 1 :(得分:3)
可以吗? Yes.
这行代码会告诉你它是不是?不可靠。一旦打破了运行时的不变量,所有代码的行为就变得不可靠了。
此行更有可能成功执行测试,但仍然不能保证:
if (ReferenceEquals(null, typeof(string).GetField("Empty").GetValue(null)))
答案 2 :(得分:2)
在普通环境中,这可能(或者更好地说应该)永远不会出现这种情况(除了运行时中的错误,或者有人在反思中),因为String.Empty
被指定为等于""
。
由于您所指的项目(AtomOS)正在使用IL2CPU将IL代码转换为本机机器指令,因此可能会用于捕获IL2CPU中的错误。
答案 3 :(得分:1)
根据标准,不,string.Empty
永远不应为空。
但是,这可能使用自定义C#编译器来编写操作系统。我认为这个测试在单元测试中会更好,但那只是我。
答案 4 :(得分:1)
在正常的应用程序中,no,String.Empty永远不能为空。
异常消息似乎表明开发人员认为编译器是初始化AtomOS的String.Empty,但这没有意义...... String.Empty在运行时由静态构造函数初始化,而不是在编译时
我不知道在AtomOS中String.Empty是否可能为null,但一般来说,除非System.String的运行时或实现有问题,否则它是不可能的。