今天犯了一個低級錯誤,暈啊!
如下面的代碼所示, #1不會對Thread的culture有impact,除非用了#2的語句。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
var curUICulInfo = Thread.CurrentThread.CurrentUICulture;
if (curUICulInfo.LCID != request.LocaleID)
{
curUICulInfo = new CultureInfo(request.LocaleID); //------#1------
Thread.CurrentThread.CurrentUICulture = new CultureInfo(request.LocaleID); //------#2------
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
在#1處,curUICulInfo會引用到一個新的object,而保持原來的Thread.CurrentThread.CurrentUICulture不變;她們倆是不同的object。
話說起來,如果在c++中,我可能能馬上想到#1這裏(不吹牛:-) ),這個變量會重新指向一塊內存,但是在C#代碼中完全沒有了這個意識...
以這個爲例,棧上的variable會指向managed heap中的object;重新給棧variable賦值,他的指向會變掉。也就是說,基本的build-in類型、struct和class,這些類型的variable,使用她們,或者對她們進行修改,都是對同一份object在操作;但是,class類型的variable,重新賦值,會重新引用到一份new的object上,這樣就有了2份;因爲他們是.net中的引用,相當於c++中的指針(不是c++的引用,因爲指向可以變)。
這就可以聯繫到一個經典的C/C++面試題。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
void AllocateMem(Obj* a_ptr)
{
a_ptr = new Obj();
}
Obj* l_pObj = NULL;
AllocateMem(l_pObj); //問現在l_pObj還NULL嗎?
------------------------------------------------------------------------------------------------------------------------------------------------------------------
雖然.net runtime幫助我們管理了資源,不用擔心釋放的問題,但是分配的問題還是需要自己處理的;關於分配的一些觀念,有很多需要繼承C++裏的。
Keep it in MIND.