Beginner with c# 2
2024-07-21 02:19:54
供稿:網(wǎng)友
1。2 自動化的內(nèi)存管理(automatic memory management)
手動管理內(nèi)存需要程序員自行分配和釋放內(nèi)存塊。這要求程序員有清晰的頭腦和對整個運行過程有十分的
把握(好難!)。而c#把程序員從這難以承擔的任務中解放出來。在多數(shù)的情況下,這種自動內(nèi)存管理提
高代碼的質(zhì)量和程序員的生產(chǎn)力。并且,不會對程序的意圖和執(zhí)行產(chǎn)生幅面的影響(?俺可不相信m$的鬼
話)。不過,估計比java的回收站好一點吧。因為c#出道遲嘛(盡胡扯)。好了,來看看例子。*/
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類實現(xiàn)了一系列node的實例。大家可以看看stack類的push方法。node的實例就是在push方法中創(chuàng)建的。
就是“first = new node(o, first);”。請記住這個“new”噢。它就是用來創(chuàng)建類實例的。相關的語法太
多,遛到后面用一節(jié)詳細講。這里只是要了解自動內(nèi)存管理(automatic memory management)好處?!“new”
是負責初始化類實例。而在c/c++中釋放這些實例要用另一個關鍵字“delete”。但是在什么時候用delete呢,
這通常是很費神的活,老手也會陰溝里翻船。何況是俺呢!但在c#中有不用了。例子里就沒有用“delete”。
當node的實例不需要時,垃圾收集器(garbage collector)自動銷毀它,不用俺操心嘍。這點到和java挺
像的(可能是抄的)。
在一個test類里,俺用了一個循環(huán),對stack類的實例的push方法賦值十次。于是,push創(chuàng)建了node的十個實
例(instance)。然后用pop把它們顯示出來。其順序正好與創(chuàng)建的順序相反。
這個例子相當?shù)暮茫莝tack
的一個典型,也很好的表述了自動內(nèi)存管理的機制。但也不好懂,好在這一節(jié)不是寫給毫無基礎的網(wǎng)友看的。
俺自個都花了幾分鐘看明白,各位大蝦更是沒問題。
其實,當顯示完了“10”以后,就會有一個node的實例符合被釋放的條件,但垃圾收集器并不一定會這樣做。
也就是說,它的行為并不確定(這和java一樣,俺猜)。有時候,這種行為會帶來一些負面影響。起碼是性
能降低。自動內(nèi)存管理本身也是有問題的。因為它很難管理一些特殊情況。有一些關于java的垃圾收集器的
文章也有提到。m$也不會好得了多少。所以,m$有個不安全代碼的術(shù)語(unsafe code),用來為高級用戶服
務。即,用戶可以不采用垃圾收集器。但必須用“unsafe”關鍵字顯式聲明之。這樣就避免了用戶不經(jīng)意以
外使用不安全代碼。下面是一個例子:*/
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);
}
}
/*
俺對這個例子不是很滿意,也讓俺有點迷惑,有機會再自己寫一個。很簡單,只是可以用指針了!萬歲!
其實,俺對這一節(jié)最沒有把握了!有不少地方都不能自圓其說!所以,請各位大蝦大力批評。*/