Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:什么';fixed语句在空字符串上的行为是什么?_C#_String_Mono_Clr_Unsafe - Fatal编程技术网

C#:什么';fixed语句在空字符串上的行为是什么?

C#:什么';fixed语句在空字符串上的行为是什么?,c#,string,mono,clr,unsafe,C#,String,Mono,Clr,Unsafe,,这是C#语言规范的一部分,表示C#中fixed的行为是实现定义的,如果它用于空/空数组引用。引用它: 数组类型的表达式,其中包含非托管类型T的元素,前提是类型T*可以隐式转换为fixed语句中给定的指针类型。在这种情况下,初始值设定项计算数组中第一个元素的地址,并保证整个数组在fixed语句期间保持在固定地址如果数组表达式为null或数组中有零个元素,则固定语句的行为由实现定义。 但是,它并没有对空字符串做出相同的声明,只是说如果字符串为null,则不会定义行为。下面是下一段,详细介绍了它如何

,这是C#语言规范的一部分,表示C#中
fixed
的行为是实现定义的,如果它用于空/空数组引用。引用它:

数组类型的表达式,其中包含非托管类型T的元素,前提是类型T*可以隐式转换为fixed语句中给定的指针类型。在这种情况下,初始值设定项计算数组中第一个元素的地址,并保证整个数组在fixed语句期间保持在固定地址如果数组表达式为null或数组中有零个元素,则固定语句的行为由实现定义。

但是,它并没有对空字符串做出相同的声明,只是说如果字符串为null,则不会定义行为。下面是下一段,详细介绍了它如何处理字符串:

字符串类型的表达式,前提是char*类型可隐式转换为fixed语句中给定的指针类型。在这种情况下,初始值设定项计算字符串中第一个字符的地址,并保证整个字符串在fixed语句期间保持在固定地址如果字符串表达式为null,则固定语句的行为由实现定义。

如果我读对了,这意味着行为是为空字符串定义的,对吗?那么,如果你这样做会发生什么

fixed (char* pch = string.Empty)
{
    Console.WriteLine((int)*pch);
}
??由于.NET中的字符串以null结尾,是否保证打印出0?是否所有ECMA 335实现(如Microsoft的CLR、Mono)都要求字符串以空结尾


谢谢。

是的,由于后面的18.6:

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

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