C#:固定语句在空字符串上的行为是什么?

时间:2016-06-10 22:05:13

标签: c# string mono clr unsafe

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)都要求字符串以空值终止?

感谢。

1 个答案:

答案 0 :(得分:3)

是的,由于后来的18.6位,它保证打印出0:

  

通过修复字符串实例生成的char*值始终指向以null结尾的字符串。在获取指向字符串实例s的指针p的固定语句中,范围从pp + s.Length - 1的指针值表示字符串中字符的地址,指针值p + s.Length总是如此指向空字符(值为' \ 0')的字符。

我不能说我已经在Mono上试过这个,但如果是这样的话肯定会出现违规问题。 ECMA标准中出现与MS规范相同的文本。 (C#2版本中的第27.6条;在C#5版本中它看起来像是24.7。)