|
1。2 自動(dòng)化的內(nèi)存管理(Automatic memory management) 手動(dòng)管理內(nèi)存需要程序員自行分配和釋放內(nèi)存塊。這要求程序員有清晰的頭腦和對整個(gè)運(yùn)行過程有十分的 把握(好難!)。而c#把程序員從這難以承擔(dān)的任務(wù)中解放出來。在多數(shù)的情況下,這種自動(dòng)內(nèi)存管理提 高代碼的質(zhì)量和程序員的生產(chǎn)力。并且,不會(huì)對程序的意圖和執(zhí)行產(chǎn)生幅面的影響(?俺可不相信m$的鬼 話)。不過,估計(jì)比java的回收站好一點(diǎn)吧。因?yàn)閏#出道遲嘛(盡胡扯)。好了,來看看例子。*/
using System; public class Stack { private Node first = null; public bool Empty { get { return (first == null); } } public object Pop() { if (first == null) throw new Exception("Can't Pop from an empty Stack."); else { object temp = first.Value; first = first.Next; return temp; } } public void Push(object o) { first = new Node(o, first); } class Node { public Node Next; public object Value; public Node(object value): this(value, null) {} public Node(object value, Node next) { Next = next; Value = value; } } }
class Test { static void Main() { Stack s = new Stack(); for (int i = 0; i < 10; i++) s.Push(i); while (!s.Empty) Console.WriteLine(s.Pop()); } } /* stack類實(shí)現(xiàn)了一系列Node的實(shí)例。大家可以看看stack類的Push方法。Node的實(shí)例就是在Push方法中創(chuàng)建的。 就是“first = new Node(o, first);”。請記住這個(gè)“new”噢。它就是用來創(chuàng)建類實(shí)例的。相關(guān)的語法太 多,遛到后面用一節(jié)詳細(xì)講。這里只是要了解自動(dòng)內(nèi)存管理(Automatic memory management)好處?!“new” 是負(fù)責(zé)初始化類實(shí)例。而在c/c++中釋放這些實(shí)例要用另一個(gè)關(guān)鍵字“delete”。但是在什么時(shí)候用delete呢, 這通常是很費(fèi)神的活,老手也會(huì)陰溝里翻船。何況是俺呢!但在c#中有不用了。例子里就沒有用“delete”。 當(dāng)Node的實(shí)例不需要時(shí),垃圾收集器(garbage collector)自動(dòng)銷毀它,不用俺操心嘍。這點(diǎn)到和java挺 像的(可能是抄的)。
在一個(gè)test類里,俺用了一個(gè)循環(huán),對stack類的實(shí)例的Push方法賦值十次。于是,Push創(chuàng)建了Node的十個(gè)實(shí) 例(instance)。然后用Pop把它們顯示出來。其順序正好與創(chuàng)建的順序相反。 這個(gè)例子相當(dāng)?shù)暮,是stack 的一個(gè)典型,也很好的表述了自動(dòng)內(nèi)存管理的機(jī)制。但也不好懂,好在這一節(jié)不是寫給毫無基礎(chǔ)的網(wǎng)友看的。 俺自個(gè)都花了幾分鐘看明白,各位大蝦更是沒問題。
其實(shí),當(dāng)顯示完了“10”以后,就會(huì)有一個(gè)Node的實(shí)例符合被釋放的條件,但垃圾收集器并不一定會(huì)這樣做。 也就是說,它的行為并不確定(這和java一樣,俺猜)。有時(shí)候,這種行為會(huì)帶來一些負(fù)面影響。起碼是性 能降低。自動(dòng)內(nèi)存管理本身也是有問題的。因?yàn)樗茈y管理一些特殊情況。有一些關(guān)于java的垃圾收集器的 文章也有提到。m$也不會(huì)好得了多少。所以,m$有個(gè)不安全代碼的術(shù)語(unsafe code),用來為高級用戶服 務(wù)。即,用戶可以不采用垃圾收集器。但必須用“unsafe”關(guān)鍵字顯式聲明之。這樣就避免了用戶不經(jīng)意以 外使用不安全代碼。下面是一個(gè)例子:*/
using System; class Test { unsafe static void WriteLocations(byte[] arr) { fixed (byte *p_arr = arr) { byte *p_elem = p_arr; for (int i = 0; i < arr.Length; i++) { byte value = *p_elem; string addr = int.Format((int) p_elem, "X"); Console.WriteLine("arr[{0}] at 0x{1} is {2}", i, addr, value); p_elem++; } } } static void Main() { byte[] arr = new byte[] {1, 2, 3, 4, 5}; WriteLocations(arr); } } /* 俺對這個(gè)例子不是很滿意,也讓俺有點(diǎn)迷惑,有機(jī)會(huì)再自己寫一個(gè)。很簡單,只是可以用指針了!萬歲! 其實(shí),俺對這一節(jié)最沒有把握了!有不少地方都不能自圓其說!所以,請各位大蝦大力批評。*/
|