新聞中心
所有對(duì)象存活,運(yùn)作的平臺(tái)就是CLR(Common language runtime),這句話我琢磨了很久,加上最近自己寫(xiě)的代碼中出現(xiàn)的一些有趣的現(xiàn)象,讓我對(duì).net有了一些有趣的想法。拿來(lái)和大家分享下,以證謬誤,求得真知。好,閑話不說(shuō)了。先拿出自己碰到寫(xiě)程序時(shí)碰到的一個(gè)小插曲。和大家聊聊。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比臺(tái)江網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式臺(tái)江網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋臺(tái)江地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
先聊一下List< T>
MSDN上的解釋Represents a strongly typed list of objects that can be accessed by index. Provides methods to search, sort, and manipulate lists.
我的理解:List< T>存儲(chǔ)具有相同數(shù)據(jù)信息類型的列表,這個(gè)對(duì)象提供對(duì)這個(gè)列表的增刪改查的功能接口。
請(qǐng)大家看一下我碰到的一個(gè)對(duì)List< T>操作時(shí)碰到的有趣的問(wèn)題,我把它貼出來(lái),我想看到這篇文章的人有很多已經(jīng)碰到過(guò)這個(gè)問(wèn)題:
稍作說(shuō)明:Error1 編譯錯(cuò)誤,Error2 ,Error3 運(yùn)行錯(cuò)誤。話說(shuō)回來(lái),這個(gè)編譯器還是很強(qiáng)大的。至于為什么第一個(gè)是編譯錯(cuò)誤,第二,三是運(yùn)行時(shí)錯(cuò)誤,我覺(jué)得這也是一個(gè)有趣的問(wèn)題,如果那個(gè)大蝦還是小蝦有見(jiàn)解的話,叫上我一起討論下。在語(yǔ)義分析階段,不能發(fā)現(xiàn)第二個(gè)和第三個(gè)錯(cuò)誤嗎?
我們先不管軟硬件問(wèn)題,先看邏輯分析:
List< T> 列表的意義,和我們?nèi)コ匈I東西都會(huì)拿到這個(gè)東西,里面有時(shí)間,日期,價(jià)格,商品,等等,每一個(gè)信息類型基本都是一樣的。記錄我們的購(gòu)買信息,我們假設(shè)拿到了這個(gè)列表,我們從第一行遍歷看起,第一個(gè),第二個(gè),第三個(gè)。。。。。。第n個(gè)。突然興奮的發(fā)現(xiàn)。超市的機(jī)器發(fā)生了錯(cuò)誤。把原本1.00元的產(chǎn)品,讀成了0.01元。我的天!走狗屎運(yùn)啦。我們興奮的拿筆自己修改這個(gè)選項(xiàng)?;丶铱梢耘d奮的向你女朋友邀功。今天省了0.9毛哦。
我們看這個(gè)過(guò)程,遍歷,修改其中的一項(xiàng)。邏輯上成立嗎?一點(diǎn)問(wèn)題都沒(méi)有,信息傳輸正確嗎?當(dāng)然。我們記錄了我們修改的信息。這次我們對(duì)信息的修改完全正確無(wú)誤。并用遍歷,修改的邏輯完成了一次完美的操作。
那為什么把這個(gè)工作交給.net,它就干不了?
以下分析純粹是個(gè)人理解,沒(méi)有經(jīng)過(guò)事實(shí)的佐證。如果那位有正解,在對(duì)本人想法嗤之以鼻的同時(shí),萬(wàn)望貼出自己的想法。
我想從機(jī)器讀我們寫(xiě)的上面的高級(jí)指令開(kāi)始分析。
編譯它,形成IL代碼,這個(gè)IL 其中,蘊(yùn)含了什么信息。此次,限于本人時(shí)間和水平有限,請(qǐng)那位說(shuō)明一下 。如果讀到此貼的大蝦。寫(xiě)過(guò)了解C#編譯有什么特點(diǎn),請(qǐng)貼出,本人除了知道語(yǔ)法,詞法,語(yǔ)意原理,大概是什么流程結(jié)構(gòu)外。沒(méi)有動(dòng)手實(shí)踐過(guò),所以此步完全靠原理分析。略過(guò)
中間IL
最后的執(zhí)行猜測(cè)
內(nèi)存中數(shù)據(jù)與指令的猜測(cè)。
稍作說(shuō)明:左邊為數(shù)據(jù)堆棧就是List< T>,右邊為對(duì)數(shù)據(jù)進(jìn)行操作的指令就是add(),delete(),move()....最后形成的指令集合。下面單獨(dú)拿出一個(gè)塊獲取數(shù)據(jù)堆狀態(tài),這個(gè)圖是一個(gè)數(shù)據(jù)邏輯圖,我自己猜測(cè)的。不是匯編指令形成的物理結(jié)構(gòu)圖。不討論尋址,指針級(jí)別的內(nèi)容。
回到最初,為什么?foreach()之中不可以delete,remove,modify
返回頭我們想想,如果它支持在foreach的時(shí)候改,增,刪 的話又要做些什么工作呢?
比如要?jiǎng)h一個(gè)。
程序大概要做幾件事情:第一 :記錄數(shù)據(jù)堆刪之前的狀態(tài),第二做數(shù)據(jù)處理,copy歷史記錄,第三:執(zhí)行操作,第四:將新的數(shù)據(jù)堆返回給原地址或壓根就改個(gè)讀的首地址得了。如果,其它對(duì)象引用了這堆數(shù)據(jù)操作就更復(fù)雜啦。這幾步只是我個(gè)人的一個(gè)理解模板,如果真要深究,什么地址,算法,壓棧,出棧什么的,程序要做的事情就更多了。
回到我們發(fā)現(xiàn)這個(gè)問(wèn)題的起點(diǎn)。以及OO的理解,有趣的問(wèn)題就會(huì)接總而來(lái),如果,你寫(xiě)程序的時(shí)候,模擬我上面講的那個(gè)修改賬單的過(guò)程,用OO思想又怎么樣設(shè)計(jì)呢? 把人做一個(gè)對(duì)象,把賬單做一個(gè)對(duì)象?我想如果是一個(gè)非程序員,讓他或她用面向?qū)ο蟮乃枷敕治鲆幌隆V辽儆幸话氲娜藭?huì)這么分解這個(gè)對(duì)象圖。那如果我們也這么分解。有沒(méi)有這么問(wèn)題?這中間是不是少了有價(jià)值的分解。如果那樣分解的話,軟件平臺(tái),機(jī)器能不能直接理解我們的程序意圖,支持不支持呢?
想起我上一次發(fā)的那個(gè)帖子,從設(shè)計(jì),數(shù)學(xué),指令,甚至從哲學(xué)上來(lái)看OO.OO 實(shí)在是一個(gè)強(qiáng)大又非常難控制的思想。我們是不是需要在學(xué)習(xí)了解精美的設(shè)計(jì)模式之外,去理解程序,甚至數(shù)學(xué)的本質(zhì),那樣是不是能讓我們更有效的去掌控這個(gè)平臺(tái)的威力。
另外提一下:如果用for(int index = 0; index < myList.count; index++) 這種方式去執(zhí)行上面那段程序,結(jié)果有會(huì)不一樣。
網(wǎng)頁(yè)名稱:.NET真的不用管內(nèi)存嗎?從List﹤T﹥列表聊起
網(wǎng)站地址:http://www.5511xx.com/article/ccojejs.html


咨詢
建站咨詢
