首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 不安全代碼核心概念(一):unsafe 上下文、指標型別與基本操作

     編輯:關於C#

引言

C# 屬託管語言,記憶體由 GC 管理。但需呼叫作業系統 API、存取記憶體映射裝置或極致效能演算法時,可使用 unsafe 代碼直接操作指標。

unsafe 上下文

unsafe 修飾符可用於:

  • 類型:class, struct, interface, delegate
  • 成員:field, method, property, event, indexer, operator, constructor, destructor
  • 區塊:unsafe { ... }

指標型別系統

僅在 unsafe 上下文有效(typeof 例外)。語法:unmanaged-type * 或 void *。

非託管型別

  • 基礎型別:sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool
  • enum 型別
  • 指標型別本身
  • 僅包含非託管欄位的 struct

聲明差異

// C/C++: int *p1, *p2;
// C#:
int* p1, p2; // 兩個都是 int*,* 綁定在型別上

特性

  • 可為 null(全 0 位),解引用行為未定義
  • void*:未知型別指標,不可解引用/算術,但可互轉任意指標
  • 指標型別不繼承自 object,不可裝箱/拆箱,不可作泛型型別參數
  • 可用 ref/out 傳遞,但易導致懸空指標
  • 方法可回傳指標型別

核心操作符

實用範例

尋找陣列元素

unsafe static int* Find(int* arr, int size, int value) {
    for (int i = 0; i < size; i++)
        if (*arr == value) return arr;
        else arr++;
    return null;
}

指標參數陷阱

static int value = 20;
unsafe static void F(out int* pi1, ref int* pi2) {
    int local = 10;
    pi1 = &local; // 危險:local 退出作用域後失效
    fixed (int* pj = &value) pi2 = pj; // 危險:fixed 區塊結束後 value 可能移動
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算子用途
*間接存取(解引用)
->透過指標存取結構成員
[]指標索引存取
&取得變數位址
++ --指標遞增/遞減
+ -指標算術運算
== != < > <= >=指標比較
stackalloc堆疊配置記憶體
fixed暫時固定變數位址