Beginner with c# 2 (轉)
/* In my translation, NGWS SDK's documentation and MSDN are also referenced in somewhere.
1。2 自動化的管理(Automatic memory management)
手動管理記憶體需要員自行分配和釋放記憶體塊。這要求程式設計師有清晰的頭腦和對整個執行過程有十分的
把握(好難!)。而把程式設計師從這難以承擔的任務中解放出來。在多數的情況下,這種自動記憶體管理提
高程式碼的質量和程式設計師的生產力。並且,不會對程式的意圖和產生幅面的影響(?俺可不相信m$的鬼
話)。不過,估計比的回收站好一點吧。因為c#出道遲嘛(盡胡扯)。好了,來看看例子。*/
using System;
public class Stack
{
private Node first = null;
public bool Empty {
get {
return (first == null);
}
}
public 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類實現了一系列Node的例項。大家可以看看stack類的Push方法。Node的例項就是在Push方法中建立的。
就是“first = new Node(o, first);”。請記住這個“new”噢。它就是用來建立類例項的。相關的語法太
多,遛到後面用一節詳細講。這裡只是要了解自動記憶體管理(Automatic memory management)好處?!“new”
是負責初始化類例項。而在c/c++中釋放這些例項要用另一個關鍵字“delete”。但是在什麼時候用delete呢,
這通常是很費神的活,老手也會陰溝裡翻船。何況是俺呢!但在c#中有不用了。例子裡就沒有用“delete”。
當Node的例項不需要時,垃圾收集器(garbage collector)自動銷燬它,不用俺操心嘍。這點到和java挺
像的(可能是抄的)。
在一個test類裡,俺用了一個迴圈,對stack類的例項的Push方法賦值十次。於是,Push建立了Node的十個實
例(instance)。然後用Pop把它們顯示出來。其順序正好與建立的順序相反。
這個例子相當的好,是stack
的一個典型,也很好的表述了自動記憶體管理的機制。但也不好懂,好在這一節不是寫給毫無基礎的網友看的。
俺自個都花了幾分鐘看明白,各位大蝦更是沒問題。
其實,當顯示完了“10”以後,就會有一個Node的例項符合被釋放的條件,但垃圾收集器並不一定會這樣做。
也就是說,它的行為並不確定(這和java一樣,俺猜)。有時候,這種行為會帶來一些負面影響。起碼是性
能降低。自動記憶體管理本身也是有問題的。因為它很難管理一些特殊情況。有一些關於java的垃圾收集器的
文章也有提到。m$也不會好得了多少。所以,m$有個不程式碼的術語(unsafe code),用來為高階服
務。即,使用者可以不採用垃圾收集器。但必須用“unsafe”關鍵字顯式宣告之。這樣就避免了使用者不經意以
外使用不安全程式碼。下面是一個例子:*/
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);
}
}
/*
俺對這個例子不是很滿意,也讓俺有點迷惑,有機會再自己寫一個。很簡單,只是可以用指標了!萬歲!
其實,俺對這一節最沒有把握了!有不少地方都不能自圓其說!所以,請各位大蝦大力批評。*/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987286/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Beginner with C# (轉)C#
- Beginner with c# 5 (轉)C#
- Beginner with c# 6 (轉)C#
- Beginner with c# 3 (轉)C#
- Beginner with c# 4 (轉)C#
- Beginner with c# 7 (轉)C#
- The Overview of ECMA C# Language Specialisation (2) (轉)ViewC#
- VB程式設計師眼中的C# 2 (轉)程式設計師C#
- C# BETA2中操作ACCESS資料庫 (轉)C#資料庫
- QT beginner QFileDialogQT
- C#方法2C#
- C# BETA2中操作ACCESS資料庫(三) (轉)C#資料庫
- C# BETA2中操作ACCESS資料庫(二) (轉)C#資料庫
- WHAT IS C# (轉)C#
- C#:Dictionary轉DataTableC#
- 可怕的 C# (轉)C#
- C#聊天程式 (轉)C#
- C# 和 API (轉)C#API
- C#問答 (轉)C#
- c# DataTable轉ListC#
- C# 操作xml(轉)C#XML
- AtCoder Beginner Contest 360
- AtCoder Beginner Contest 343
- AtCoder Beginner Contest 344
- AtCoder Beginner Contest 345
- AtCoder Beginner Contest 346
- atcoder beginner 346 題解
- 【AtCoder Beginner Contest 347】
- AtCoder Beginner Contest 348
- AtCoder Beginner Contest 347
- AtCoder Beginner Contest 349
- AtCoder Beginner Contest 363
- AtCoder Beginner Contest 364
- AtCoder Beginner Contest 365
- AtCoder Beginner Contest 361
- AtCoder Beginner Contest 361)
- AtCoder Beginner Contest 362
- AtCoder Beginner Contest 366