成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET真的不用管內存嗎?從List﹤T﹥列表聊起

開發 后端
本文敘述了一下作者碰到的一個對List< T>操作時碰到的有趣的問題。整個過程邏輯上成立,信息傳輸也正確,但是在.NET下就是工作不了。作者的分析是,這個和內存中的數據與指令有關。

所有對象存活,運作的平臺就是CLR(Common language runtime),這句話我琢磨了很久,加上最近自己寫的代碼中出現的一些有趣的現象,讓我對.net有了一些有趣的想法。拿來和大家分享下,以證謬誤,求得真知。好,閑話不說了。先拿出自己碰到寫程序時碰到的一個小插曲。和大家聊聊。

先聊一下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>存儲具有相同數據信息類型的列表,這個對象提供對這個列表的增刪改查的功能接口。

請大家看一下我碰到的一個對List< T>操作時碰到的有趣的問題,我把它貼出來,我想看到這篇文章的人有很多已經碰到過這個問題:

ListT操作問題 

稍作說明:Error1 編譯錯誤,Error2 ,Error3 運行錯誤。話說回來,這個編譯器還是很強大的。至于為什么第一個是編譯錯誤,第二,三是運行時錯誤,我覺得這也是一個有趣的問題,如果那個大蝦還是小蝦有見解的話,叫上我一起討論下。在語義分析階段,不能發現第二個和第三個錯誤嗎?

我們先不管軟硬件問題,先看邏輯分析:

List< T> 列表的意義,和我們去超市買東西都會拿到這個東西,里面有時間,日期,價格,商品,等等,每一個信息類型基本都是一樣的。記錄我們的購買信息,我們假設拿到了這個列表,我們從第一行遍歷看起,第一個,第二個,第三個。。。。。。第n個。突然興奮的發現。超市的機器發生了錯誤。把原本1.00元的產品,讀成了0.01元。我的天!走狗屎運啦。我們興奮的拿筆自己修改這個選項。回家可以興奮的向你女朋友邀功。今天省了0.9毛哦。

我們看這個過程,遍歷,修改其中的一項。邏輯上成立嗎?一點問題都沒有,信息傳輸正確嗎?當然。我們記錄了我們修改的信息。這次我們對信息的修改完全正確無誤。并用遍歷,修改的邏輯完成了一次完美的操作。

那為什么把這個工作交給.net,它就干不了?

以下分析純粹是個人理解,沒有經過事實的佐證。如果那位有正解,在對本人想法嗤之以鼻的同時,萬望貼出自己的想法。

我想從機器讀我們寫的上面的高級指令開始分析。

編譯它,形成IL代碼,這個IL 其中,蘊含了什么信息。此次,限于本人時間和水平有限,請那位說明一下 。如果讀到此貼的大蝦。寫過了解C#編譯有什么特點,請貼出,本人除了知道語法,詞法,語意原理,大概是什么流程結構外。沒有動手實踐過,所以此步完全靠原理分析。略過

中間IL

最后的執行猜測

內存中數據與指令的猜測。

指令集合 

稍作說明:左邊為數據堆棧就是List< T>,右邊為對數據進行操作的指令就是add(),delete(),move()....最后形成的指令集合。下面單獨拿出一個塊獲取數據堆狀態,這個圖是一個數據邏輯圖,我自己猜測的。不是匯編指令形成的物理結構圖。不討論尋址,指針級別的內容。

回到最初,為什么?foreach()之中不可以delete,remove,modify

返回頭我們想想,如果它支持在foreach的時候改,增,刪 的話又要做些什么工作呢?

比如要刪一個。

程序大概要做幾件事情:第一 :記錄數據堆刪之前的狀態,第二做數據處理,copy歷史記錄,第三:執行操作,第四:將新的數據堆返回給原地址或壓根就改個讀的首地址得了。如果,其它對象引用了這堆數據操作就更復雜啦。這幾步只是我個人的一個理解模板,如果真要深究,什么地址,算法,壓棧,出棧什么的,程序要做的事情就更多了。

回到我們發現這個問題的起點。以及OO的理解,有趣的問題就會接總而來,如果,你寫程序的時候,模擬我上面講的那個修改賬單的過程,用OO思想又怎么樣設計呢? 把人做一個對象,把賬單做一個對象?我想如果是一個非程序員,讓他或她用面向對象的思想分析一下。至少有一半的人會這么分解這個對象圖。那如果我們也這么分解。有沒有這么問題?這中間是不是少了有價值的分解。如果那樣分解的話,軟件平臺,機器能不能直接理解我們的程序意圖,支持不支持呢?

想起我上一次發的那個帖子,從設計,數學,指令,甚至從哲學上來看OO.OO 實在是一個強大又非常難控制的思想。我們是不是需要在學習了解精美的設計模式之外,去理解程序,甚至數學的本質,那樣是不是能讓我們更有效的去掌控這個平臺的威力。

另外提一下:如果用for(int index = 0; index <  myList.count; index++) 這種方式去執行上面那段程序,結果有會不一樣。

【編輯推薦】

  1. .NET組件中的線程輔助
  2. .NET組件和COM組件之間的相互操作
  3. C#和VB.NET類型相關知識匯總
  4. ASP.NET多附件上傳和附件編輯的實現
  5. .NET組件的注冊表中RuntimeVersion的作用
責任編輯:yangsai 來源: 博客園
相關推薦

2022-09-13 17:46:19

STA模式內存

2021-04-23 07:27:31

內存分配CPU

2009-10-12 10:04:53

VB.NET List

2022-05-09 14:09:23

多線程線程安全

2018-09-29 15:34:34

JavaList接口

2025-03-27 10:30:51

2018-11-20 09:37:19

Java內存模型

2021-09-06 08:39:24

容器Docker鏡像

2011-08-12 09:24:10

MozillaFirefox 7

2021-01-28 19:31:59

MySQL手冊方法

2023-09-27 08:49:23

.Net分配對象

2023-12-15 10:11:31

數據結構方式

2024-06-07 09:13:23

2020-12-29 10:12:19

WindowsLinux操作系統

2024-09-30 10:27:22

2020-10-21 10:53:33

Google壟斷法瀏覽器

2020-12-24 06:00:27

Python編程語言開發

2021-11-29 09:45:57

枚舉Go代碼

2016-06-01 15:42:58

Hadoop數據管理分布式

2017-08-07 08:32:58

泄密網盤存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品在线视频 | 久久久91 | 在线观看日韩精品视频 | 亚洲精品一区二区三区在线 | 91精品国产91久久综合桃花 | 18性欧美 | 大学生a级毛片免费视频 | 久久久久久一区 | 国产日韩欧美精品一区二区 | 欧美一卡二卡在线观看 | 亚洲视频在线一区 | 999久久久 | 国产香蕉视频 | 中文字幕国产一区 | 一区日韩 | 黄色片亚洲 | 日韩有码一区 | 免费看欧美一级片 | 久久蜜桃资源一区二区老牛 | 成人欧美日韩一区二区三区 | 欧美亚洲免费 | 日本亚洲精品 | 国产精品揄拍一区二区 | 日韩欧美视频在线 | 国产乱码一区 | 久久国产视频一区 | 欧美电影在线观看网站 | 国产精品毛片 | 91免费高清 | 亚洲欧美日韩在线一区二区 | 久久精品综合网 | 国产高清精品一区二区三区 | 欧美一级片在线观看 | 一级免费看片 | 免费成人国产 | 国产一区二区三区久久久久久久久 | 国产在线第一页 | 久久亚洲欧美日韩精品专区 | 亚洲精品一区二区网址 | 成人性视频免费网站 | 一区二区不卡 |