<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Beginner with c# 2

      [摘要]1。2 自動化的內存管理(Automatic memory management) 手動管理內存需要程序員自行分配和釋放內存塊。這要求程序員有清晰的頭腦和對整個運行過程有十分的 把握(好難。。而c#把程序員從這難以承擔的任務中解放出來。在多數的情況下,這種自動內存管理提 高代碼的質量和程序員的生...
      1。2 自動化的內存管理(Automatic memory management)
      手動管理內存需要程序員自行分配和釋放內存塊。這要求程序員有清晰的頭腦和對整個運行過程有十分的
      把握(好難。。而c#把程序員從這難以承擔的任務中解放出來。在多數的情況下,這種自動內存管理提
      高代碼的質量和程序員的生產力。并且,不會對程序的意圖和執行產生幅面的影響(?俺可不相信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類實現了一系列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);
      }
      }
      /*
      俺對這個例子不是很滿意,也讓俺有點迷惑,有機會再自己寫一個。很簡單,只是可以用指針了!萬歲!
      其實,俺對這一節最沒有把握了!有不少地方都不能自圓其說!所以,請各位大蝦大力批評。*/


      相關文章

      日韩精品一区二区三区高清