2010-08-08 52 views
2

我一直在讀一些關於immutable structures如string的內容。簡而言之,它們一旦創建就不會改變狀態(例如,要求子字符串爲您提供新字符串)。CLR用不可變結構做什麼?

現在,我在想知道CLR是否「知道」某種類型是不可變的,並且在運行時使用這個事實來做一些聰明的事情,或者說不可變性主要是讓某些場景更容易編程的東西?

+0

僅供參考:在.net中,'string'不是結構體。這是一個類...一個常規的舊參考類型。 – cHao 2012-05-30 20:50:01

回答

5

一般來說,CLR不會對不可變類型做任何特殊的處理。它們的處理方式與其他類型相同。

對於字符串有特殊的支持。字符串可以被實現並重用。在C#中,源代碼字符串文字由編譯器自動執行。您也可以通過致電String.Intern自己實習一個字符串。

+1

字符串文字是由編譯器實現的,而不是由CLR實現的。有可能用相同字符串的多個副本來產生IL(編譯器這樣做只是一個壞主意)。 – 2010-08-08 14:05:40

+0

@Jon Hanna:+1 - 對,沒錯。我已更新我的帖子,以使這一點更加清晰。謝謝。 – 2010-08-08 14:16:00

+1

這是一個挑剔的問題,但是因爲querant說CLR,也許他們關心的是那個而不是編譯器,否則我什麼也沒說。有時候,幼兒園可以幫助他成爲一名優秀的編碼員,而有時候這隻會讓他成爲一個令人討厭的書呆子。希望這是前者:) – 2010-08-08 14:53:35

0

在CLR的觀點中,值是MUTABLE。例如:CLR可以更改對象的數據以執行緩存。 結構的用戶無法更改其值,但CLR可以在多種情況下執行此操作。這就是爲什麼CLR不能在自身上強制執行不可變性並且不能在運行時對其進行中繼的原因。

2

潛在地,編譯器(而不是CLR)有可能在生成IL時做一些巧妙的事情。我不知道它是否確實如此,並且誠實地不關心:如果它不在將來(更高版本)。如果是這樣,也許它不會在將來(一個邊緣案例被發現顯示優化是不明智的。

我很高興地想:「好吧,如果這是隻讀,那麼也許編譯器或者CLR)會做一些聰明的事情,所以這將是一個免費的改進「,這將是一個改進,因爲我永遠不會做任何事情只讀,以利用這種優化,即使我知道它確實是這樣做的,而且這種節省是很好的,如果只讀是有意義的,我只會做一些只讀的東西。我這樣做很多,因爲我的風格傾向於大量使用不可變的對象,但我只會做因爲對象在邏輯上是不可變的,而不是爲了追求某種優化而不可變,然後必須解決不可變性問題。

當然,還有一些方法可以使用不可變對象(特別是在計算不同多線程場景對您的代碼的影響時)可以很巧妙地使用

0

編譯器和.net都不會對不可變結構做任何事情,它不會與可變結構做任何事情,儘管它只對語義上有效的結構做了一些事情,只有它們碰巧是不可變的。例如,如果將結構強制轉換爲Object,則編譯器將創建一個新的帶有與原始數據相同的數據初始化的盒裝實例。如果結構是可變的,則新實例在語義上將不會與原始實例相同,因爲對一個實例的更改不會影響其他實例。還有其他一些情況,編譯器複製結構並假裝副本在語義上與原始文件可以互換;不幸的是,我不知道有什麼辦法可以要求導致這種隱式副本的情況會引起編譯時錯誤,而不是讓副本發生。

相關問題