C# 学习笔记不安全的代码(指针) unsafe
本帖最后由 Cool_Breeze 于 2021-3-19 14:36 编辑using System;
class GenericExercise
{
delegate void GenericDelegate<T>(ref T a, ref T b);
static unsafe void Main() // 注意 unsafe
{
int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
// fixed 语句可防止垃圾回收器重新定位可移动的变量。 fixed 语句仅允许存在于不安全的上下文中。 还可以使用 fixed 关键字创建固定大小的缓冲区。
fixed(int* pa = &a, pb = &b)
{
int temp;
for (int i=0; i<a.Length; i++) // 交换值
{
temp = *(pa +i);
*(pa +i) = *(pb +i);
*(pb +i) = temp;
}
}
foreach (var i in a) Console.WriteLine(i); // 4, 5, 6
foreach (var i in b) Console.WriteLine(i); // 1, 2, 3
string str = "52破解"; // string str 就是一个 char 类型列表的首地址
fixed(char* pstr = str)
{
for (int i=0; i<str.Length; i++)
Console.WriteLine(*(pstr+i)); // 5 2 破 解
};
// 结构体
Point point = new Point(){x=111,y=222};
Point* p = &point; // 不能使用fixed语句获取已固定表达式的地址, 这里直接赋值
p->x = 333;
Console.WriteLine(p->x); // 333
Console.WriteLine(p->y); // 222
// 枚举
Color color = Color.Red;
Color* colorp = &color;
Console.WriteLine(*colorp); // Red
Class n = new Class(){x=a};
fixed(int* pn = &n.x)
{
for (int i=0; i<n.x.Length; i++)
Console.WriteLine(*(pn+i));// 4 5 6
};
// Class* pn // 无法获取托管类型的地址、大小或声明指向托管类型的指针
}
struct Point
{
public int x;
public int y;
}
enum Color
{
Red,
Blue,
Green
}
sealed class Class
{
public int[] x;
}
} unsafe。。
页:
[1]