垃圾回收
在 C 和 C++ 中,許多對象一旦聲明,就需要編程人員在對象可以安全使用之前給它們分配資源。在對象使用完資源之後,將這些資源釋放回自由內存池也是編程人員的責任。如果資源沒有釋放,當越來越多的資源被不必要地消耗時,就可以說代碼洩漏內存。而在另一方面,如果資源過早地釋放,則可能會發生數據丟失、其他內存區域破壞和 null 指針異常。
為了防止這些危險的發生,Java 和 C# 都通過一個應用程序來獨立地管理所有對象的生命周期。
在 Java 中,JVM 通過跟蹤所分配資源的引用來處理未使用的內存的釋放。只要 JVM 檢測到一個資源不再被一個有效的引用加以引用,該資源就會被當作垃圾回收。
在 C# 中,通過具有與 JVM 類似功能的公共語言運行庫 (CLR) 來處理垃圾回收。CLR 垃圾回收器周期性檢查內存堆,以查看是否有未引用的對象,並釋放這些對象所占用的資源。
安全代碼和不安全代碼
C# 的一個特別值得注意的特性是它支持非類型安全代碼。通常,CLR 負責監視 IL(Intermediate Language,中間語言)代碼的行為,並阻止任何有問題的操作。然而,有時我們希望直接訪問低級功能(例如 Win32 API 調用),只要我們負責保證這樣的代碼操作正確,我們就會被允許這樣做。這樣的代碼必須放在源代碼的不安全塊中。
unsafe 關鍵字
進行低級 API 調用、使用指針算法、執行一些其他不安全操作的 C# 代碼必須放在用 unsafe 關鍵字標記的塊中。下面任何一種情況都可以標記為 unsafe:
•
一個完整的方法
•
一段放在括號中的代碼塊
•
一個單獨的語句
下面的示例演示了上面所有三種情況中 unsafe 的使用:
using System;
class UnsafeClass
{
unsafe static void PointyMethod()
{
int i=10;
int *p = &i;
Console.WriteLine("*p = " + *p);
string address = "Pointer p = " + int.Format((int) p, "X");
Console.WriteLine(address);
}
static void StillPointy()
{
int i=10;
unsafe
{
int *p = &i;
Console.WriteLine("*p = " + *p);
string address = "Pointer p = " + int.Format((int) p, "X");
Console.WriteLine(address);
}
}
static void Main()
{
PointyMethod();
StillPointy();
}
}
在這段代碼中,整個 PointyMethod() 方法被標記為 unsafe,因為該方法聲明並使用了指針。與這段代碼一樣,一旦某個代碼塊再次使用指針,StillPointy() 方法就將其標記為 unsafe。
有關不安全代碼的更多信息,請參見 。