2012-07-17 73 views
2

如何在Metro c#中獲取字符串實習方法。如果沒有在Windows 8 c#中找到,是否有任何等價的方法來維護 系統對指定字符串的引用。在地鐵c#中缺少String.Intern()方法#

+0

您使用的是Windows 8的最新版本?我的理解是,Metro配置文件在每個發佈預覽中顯着不同。如果你找不到它,那麼你將不得不實施你自己的解決方案。你可以簡單地使用'ref'和一個自定義的方法或者一個擴展。描述你想要解決的問題,很可能你正在以錯誤的方式去解決問題。 – 2012-07-17 11:46:53

+0

我有興趣將lucene.net移植到MetroLucene;他們正在使用internpool for fieldnames。 – Mahantesh 2012-07-17 11:49:35

回答

11

這是CLR中內置的語言投影的一個不可避免的副作用,它使「.NET for Metro風格的應用程序」API成爲可能。該投影將從WinRT API調用中獲得的字符串映射到System.String。底層的字符串根本不是託管字符串,並且不在垃圾回收堆中生存。它是an HSTRING.語言投影使它表現得像一個System.String

因此,在該API中,String類沒有非常特定於託管字符串的方法。像Intern()和IsInterned()一樣,它只能用於託管字符串。複製,克隆和GetEnumerator也是。對此沒有解決方法,在mscorlib中訪問受管理的String類完全被參考程序集阻止,它將類型轉發到System.Runtime.dll。你必須讓它在沒有這種方法的情況下工作。

+1

爲什麼我們刪除字符串方法的原因並不是因爲WinRT,而是因爲我們選擇了這個機會來刪除我們後悔添加的方法,或者限制了我們的計劃圍繞未來的創新。 – 2012-08-03 03:38:21

+0

GetEnumerator()阻礙創新? – 2012-08-03 08:32:51

+4

String.GetEnumerator陷入了「如果我們再次開始,我們不會添加它」的問題。在.NET Framework中,它返回CharEnumerator,這對迭代字符串非常低效(它會導致每個循環的分配),並且自1.0天以來,C#和VB的foreach代碼吐出都沒有使用過。 (他們現在通過一個字符串變成一個foreach,實際上是一個使用字符串索引器的「for循環」)。儘管一些清除可能看起來是武斷的,但每一次清除都是故意的選擇,並落入上面的一個桶中。 – 2012-08-15 16:45:58