日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#基础—不安全代码(unsafe code)

發布時間:2025/4/5 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#基础—不安全代码(unsafe code) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.為何要有unsafe

????也許是為了實現CLR類型安全的目標吧,默認情況下,C#沒有提供指針的使用算法,但是有些情況下也可能需要指針這樣直接訪問內存的東西(雖然目前我還沒有用過),但是有時候程序員非常清楚程序的運行狀況,需要使用指針直接訪問內存以便于提高性能或者調試、監控程序運行的內存的使用狀況,以便于采取相應的措施。還有一些情況是當我們需要調用外面DLL中的函數又不能使用DllImport 時,也需要指針來傳遞這些函數。

2.unsafe 的定義

????MSDN:unsafe?關鍵字表示不安全上下文,該上下文是任何涉及指針的操作所必需的。

????其實,意思就是要使用指針前,請用unsafe 聲明下,可以使類、方法,成員,類全局變量和代碼段,但不能修飾成員函數內部的局部變量,具體為什么不清楚,還望大神指點。

 ?在使用unsafe之前,我們必須先看一段MSDN的話:在公共語言運行時 (CLR) 中,不安全代碼是指無法驗證的代碼。 C# 中的不安全代碼不一定是危險的;只是其安全性無法由 CLR 進行驗證的代碼。 因此,CLR 只對在完全受信任的程序集中的不安全代碼執行操作。 如果使用不安全代碼,由您負責確保您的代碼不會引起安全風險或指針錯誤。

? ? 因此,我們在運行unsafe 代碼是要在項目屬性-生成選項里配置下"允許運行不安全代碼"。先看下簡單的例子:

unsafe static void ChangeValue(int* pData)
{
? ?*pData = 200; //修改所在地址值
}


unsafe static void Main()
{
? ?int data = 100;
? Console.WriteLine("原始值: {0}", data);
? ChangeValue(&data); //取data地址并傳遞
? Console.WriteLine("改變地址后: {0}", data);

? Console.ReadLine();
}

程序輸出: ?原始值:100 ; ?修改地址后:200

?

3、引入fixed

? ? ? 當我們討論fixed的時候,不得不先了解下,托管代碼和非托管代碼,所謂托管代碼就是由CLR去執行的代碼而不是操作系統去執行的代碼,而非托管代碼就是繞過CLR,由操作系統直接執行,它有自己的垃圾回收、類型安全檢查等服務。

? ? ? 而不安全代碼就是允許自己使用指針訪問內存,但同時又要使用CLR提供的垃圾回收機制、類型安全檢查等服務,有的資料認為是介于CLR和非托管代碼之間的一種代碼運行機制,也可以理解。

? ? ? 正因為如此,我們自定義的指針地址就有可能被CLR垃圾回收機制重新調整位置,所以就引入了fixed ,MSDN對fixed的解釋是:fixed 語句設置指向托管變量的指針,并在執行該語句期間"固定"此變量。這樣就可以防止變量的重定位。

? ? ? 看下代碼的演示:

class PointerDemo
{
  public int x, y;
}
class Program
{
  unsafe static void ChangeValue(int* x, int* y)
  {
    *x = 200; //修改所在地址值
    *y = 300;
  }
  unsafe static void Main()
  {
    var obj = new PointerDemo();
    Console.WriteLine("原始值: {0}, {1}", obj.x, obj.y);
    fixed (int* n = &obj.x)
    {
      fixed (int* p = &obj.y)
      {
        ChangeValue(n, p); //取data地址并傳遞
      }
    }
    Console.WriteLine("改變地址后: {0}, {1}", obj.x, obj.y);
    Console.ReadLine();
  }
}

總結

以上是生活随笔為你收集整理的C#基础—不安全代码(unsafe code)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。