1. 程式人生 > 其它 >C#如何在安全的上下文中使用不安全的程式碼?

C#如何在安全的上下文中使用不安全的程式碼?

文章原文:https://www.cnblogs.com/2Yous/p/4887904.html

從通常情況下來看,為了保持型別安全,預設情況C# 不支援指標演算法。

不過,當你需要使用指標的時候,請通過使用 unsafe 關鍵字,可以定義可使用指標的不安全上下文。 有關指標的更多資訊,請參見主題指標型別

不安全程式碼概述

在公共語言執行時 (CLR) 中,不安全程式碼是指無法驗證的程式碼。 C# 中的不安全程式碼不一定是危險的;只是其安全性無法由 CLR 進行驗證的程式碼。 因此,CLR 只對在完全受信任的程式集中的不安全程式碼執行操作。 如果使用不安全程式碼,由您負責確保您的程式碼不會引起安全風險或指標錯

不安全程式碼具有下列屬性:

  • 方法、型別和可被定義為不安全的程式碼塊。

  • 在某些情況下,通過移除陣列界限檢查,不安全程式碼可提高應用程式的效能。

  • 當呼叫需要指標的本機函式時,需要使用不安全程式碼。

  • 使用不安全程式碼將引起安全風險和穩定性風險。

  • 在 C# 中,為了編譯不安全程式碼,必須用 /unsafe 編譯應用程式。

unsafe 關鍵字表示不安全上下文,該上下文是任何涉及指標的操作所必需的。 有關更多資訊,請參見 不安全程式碼和指標(C# 程式設計指南)。

可以在型別或成員的宣告中使用 unsafe 修飾符。 因此,型別或成員的整個正文範圍均被視為不安全上下文。 例如,以下是用 unsafe 修飾符宣告的方法:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}

不安全上下文的範圍從引數列表擴充套件到方法的結尾,因此指標在以下引數列表中也可以使用:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

還可以使用不安全塊從而能夠使用該塊內的不安全程式碼。 例如:

unsafe
{
    // Unsafe context: can use pointers here.
}

若要編譯不安全程式碼,必須指定 /unsafe 編譯器選項。 無法通過公共語言執行時驗證不安全程式碼。

在 Visual Studio 開發環境中設定此編譯器選項

  1. 開啟專案的“屬性”頁。

  2. 單擊“生成”屬性頁。

  3. 選中“允許不安全程式碼”複選框。

有關如何以程式設計方式設定此編譯器選項的資訊,請參見 AllowUnsafeBlocks。

編譯不安全模式的 in.cs:

csc /unsafe in.cs
class UnsafeTest
    {
       // Unsafe method: takes pointer to int:
       unsafe static void SquarePtrParam(int* p)
       {
          *p *= *p;
       }

       unsafe static void Main()
       {
          int i = 5;
          // Unsafe method: uses address-of operator (&):
          SquarePtrParam(&i);
          Console.WriteLine(i);
       }
    }
    // Output: 25