国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

C# 語言規范--1.4 自動內存管理

2024-07-21 02:30:00
字體:
來源:轉載
供稿:網友

手動內存管理要求開發人員管理內存塊的分配和回收。手動內存管理可能既耗時又麻煩。在 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);

   }

   private 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 類,它實際上是 node 實例的一個鏈接表。node 實例是在 push 方法中創建的,當不再需要它們時會對其進行垃圾回收。當任何代碼都不再可能訪問某個 node 實例時,該實例就成為垃圾回收的對象。例如,當從 stack 中移除某項時,相關的 node 實例就符合了垃圾回收條件,等待被回收。

示例

class test

{

   static void main() {

      stack s = new stack();

      for (int i = 0; i < 10; i++)

         s.push(i);

      s = null;

   }

}

顯示了使用 stack 類的代碼。該代碼創建了一個 stack 類,并用 10 個元素初始化該類,然后給它賦值 null。給變量 s 賦了 null 值后,stack 及關聯的 10 個 node 實例變得符合垃圾回收條件。垃圾回收器可以立即清除上述實例,但并沒要求它一定做到立即清除。

為 c# 服務的基礎垃圾回收器可以通過在內存中移動對象來工作,而這種移動對于大多數 c# 開發人員是不可見的。對于那些通常滿足于自動內存管理、但有時又需要精確控制或細微性能調整的開發人員,c# 提供了編寫“不安全”代碼的能力。這類代碼可以直接處理指針類型和對象地址。但是,c# 要求程序員固定對象,暫時阻止垃圾回收器移動它們。

從開發人員和用戶的角度,這種“不安全”代碼功能實際上是一種“安全”的功能。在代碼中必須用修飾符 unsafe 清楚地標記出不安全代碼,以便開發人員不可能不經意地使用不安全語言功能,并且編譯器和執行引擎協同工作,確保不安全代碼無法假冒安全代碼。這些限制將不安全代碼的使用僅限于代碼受到信任的情況。

示例

using system;

class test

{

   static void writelocations(byte[] arr) {

      unsafe {

         fixed (byte* parray = arr) {

            byte* pelem = parray;

            for (int i = 0; i < arr.length; i++) {

               byte value = *pelem;

               console.writeline("arr[{0}] at 0x{1:x} is {2}",

                  i, (uint)pelem, value);

               pelem++;

            }

         }

      }

   }

   static void main() {

      byte[] arr = new byte[] {1, 2, 3, 4, 5};

      writelocations(arr);

   }

}

顯示了一個名為 writelocations 的方法。它含有一個不安全塊,該塊固定了一個數組實例,然后使用指針操作實現逐個地訪問該數組的元素。每個數組元素的索引、值和位置被寫入控制臺。下面是一個可能的輸出示例:

arr[0] at 0x8e0360 is 1

arr[1] at 0x8e0361 is 2

arr[2] at 0x8e0362 is 3

arr[3] at 0x8e0363 is 4

arr[4] at 0x8e0364 is 5

當然,確切的內存位置可能因應用程序的不同執行而異。

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浮梁县| 奉化市| 聂拉木县| 白水县| 眉山市| 班玛县| 瓮安县| 柘荣县| 沅江市| 扶风县| 宜良县| 宣城市| 益阳市| 郸城县| 永福县| 德阳市| 西昌市| 柳州市| 九龙县| 璧山县| 漳浦县| 黑龙江省| 东海县| 呼伦贝尔市| 保康县| 新乐市| 南丰县| 商南县| 庄河市| 海林市| 石台县| 邢台县| 灵丘县| 太原市| 葵青区| 富顺县| 蓬安县| 大城县| 安庆市| 天全县| 芮城县|