This document是C#语言规范的一部分,它表示如果在空/空数组引用上使用C#中fixed
的行为是实现定义的。引用它:
具有非托管类型T的元素的数组类型的表达式,前提是类型T *可隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算数组中第一个元素的地址,并保证整个数组在固定语句的持续时间内保持固定地址。 如果数组表达式为null或者数组元素为零,则fixed语句的行为是实现定义的。
但是,它对空字符串没有相同的声明,只是说如果字符串为null则不会定义行为。这是下一段详细说明字符串的工作方式:
类型为string的表达式,前提是char *类型可以隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算字符串中第一个字符的地址,并保证整个字符串在固定语句的持续时间内保持固定地址。 如果字符串表达式为null,则fixed语句的行为是实现定义的。
因此,如果我正确地读取这个,这意味着为空字符串定义了行为,对吧?那么,如果您执行类似
的操作,会发生什么fixed (char* pch = string.Empty)
{
Console.WriteLine((int)*pch);
}
?是否可以保证打印出0,因为.NET中的字符串是以空值终止的?是否所有ECMA 335实现(例如Microsoft的CLR,Mono)都要求字符串以空值终止?
感谢。
答案 0 :(得分:3)
是的,由于后来的18.6位,它保证打印出0:
通过修复字符串实例生成的
char*
值始终指向以null结尾的字符串。在获取指向字符串实例s的指针p的固定语句中,范围从p
到p + s.Length - 1
的指针值表示字符串中字符的地址,指针值p + s.Length
总是如此指向空字符(值为' \ 0')的字符。
我不能说我已经在Mono上试过这个,但如果是这样的话肯定会出现违规问题。 ECMA标准中出现与MS规范相同的文本。 (C#2版本中的第27.6条;在C#5版本中它看起来像是24.7。)