This document是C#语言规范的一部分,它说如果在空/空数组引用上使用C#中的fixed
行为是实现定义的。引用它:C#:空字符串上固定语句的行为是什么?
如果T *类型可以隐式转换为固定语句中指定的指针类型,则表示带有非托管类型T的元素的数组类型。在这种情况下,初始化器计算数组中第一个元素的地址,并且整个数组保证在固定语句的持续时间内保持固定地址。 如果数组表达式为null或数组中有零个元素,则固定语句的行为是实现定义的。
但是,它并没有对空字符串做出相同的声明,只是说如果字符串为空则行为没有定义。这里的下一段落的细节它是如何工作的字符串:
一个字符串类型的表达式,提供的类型char *可以隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算字符串中第一个字符的地址,并且整个字符串保证在固定语句的持续时间内保持固定地址。 如果字符串表达式为null,则固定语句的行为是实现定义的。
所以,如果我正确地读这个,这意味着行为是为空字符串定义的,对吧?那么,如果你做类似
fixed (char* pch = string.Empty)
{
Console.WriteLine((int)*pch);
}
?它保证打印出0,因为.NET中的字符串是空终止的?是否所有ECMA 335实现(例如Microsoft的CLR,Mono)都要求字符串以空字符结尾?
谢谢。