2016-06-10 40 views
2

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)都要求字符串以空字符结尾?

谢谢。

回答

3

是的,它保证打印出0由于18.6稍后位:通过固定字符串实例产生

char*一个值总是指向一个空终止字符串。在获得指向字符串实例s的指针p的固定语句中,范围从pp + s.Length - 1的指针值表示字符串中字符的地址,并且指针值p + s.Length始终指向空字符(值为'\ 0' )。

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

相关问题