.Net - C#的引用概念不能沒有啊

今天犯了一個低級錯誤,暈啊!

如下面的代碼所示, #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.

發佈了72 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章