2016-06-10 96 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)。