C#重點知識詳解(二) (轉)

worldblog發表於2007-12-06
C#重點知識詳解(二) (轉)[@more@]

第二章 管理

記憶體管理提供了與一樣的自動記憶體管理功能,讓員從繁重的記憶體管理中擺脫出來,記憶體管理提高了程式碼的質量和提高了開發。

c#限制了著指標的使用,免除了程式設計師對記憶體洩漏的煩惱,但是不是意味著向java程式設計師一樣c#程式設計師在也不能使用指標代來的好處。在設計C#語言時考慮到這個問題,在一方面拋棄指標的同時,另一方面採用折衷的辦法,透過一個標誌來時程式引入指標。

首先我們來了解自動記憶體管理

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;
  }
}
}

程式建立了一個stack類來實現一個鏈,使用一個push方法建立Node節點例項和一個當不再需要Node節點時的收集器。一個節點例項不能被任何程式碼訪問時,就被收集。例如當一個點元素被移出棧,相關的Node就被收集。

The example

class Test
{
static void Main() {
Stack s = new Stack();

for (int i = 0; i < 10; i++)
  s.Push(i);

  s = null;
}
}

 

 

 關於指標的引用,c#中使用unsafe標誌來代表隊指標的引用。以下程式演示了指標的用法,不過由於使用指標,記憶體管理就不得不手工完成。

using System;

class Test
{
unsafe static void Locations(byte[] ar) {
fixed (byte *p = ar) {
  byte *p_elem = p;
  for (int i = 0; i < ar.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(ar);
}
}

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988915/,如需轉載,請註明出處,否則將追究法律責任。

相關文章