C# 摆脱指针和非托管代码
在一位朋友建议我为什么不应该使用非托管代码后,我一直在尝试摆脱目前在源代码中使用的非托管代码。然而,我似乎一直面临着一些问题。在大多数情况下,我使用Buffer.BlockCopy(),因为它似乎是最合适的方法,但仍有一些情况下我不确定使用什么 基本上,这用于处理在服务器和客户端之间发送的数据包。WriteInt16是一个函数,用于在字节数组中写入C# 摆脱指针和非托管代码,c#,C#,在一位朋友建议我为什么不应该使用非托管代码后,我一直在尝试摆脱目前在源代码中使用的非托管代码。然而,我似乎一直面临着一些问题。在大多数情况下,我使用Buffer.BlockCopy(),因为它似乎是最合适的方法,但仍有一些情况下我不确定使用什么 基本上,这用于处理在服务器和客户端之间发送的数据包。WriteInt16是一个函数,用于在字节数组中写入ushort值。(1.基本上只是在偏移量20和22处进行此操作) 我将在下面留下几个例子: 一, 二, 三, 假设小端平台和字节数组(未测试): 是
ushort
值。(1.基本上只是在偏移量20和22处进行此操作)
我将在下面留下几个例子:
一,
二,
三,
假设小端平台和字节数组(未测试): 是 及 是
对于这些数据所表示的内容,为什么不使用强类型呢?旁注:我喜欢你的朋友告诉你这是不安全的,而不是仅仅从你必须使用的关键字
unsafe
中意识到这一点。我知道这个关键字是不安全的,我的意思是他向我解释了为什么我不应该使用不安全代码及其含义代码应该做什么?在不清楚目的是什么的情况下,很难提出替代方案。此外,无论代码是否不安全,空的catch{}
都是不好的做法。还要注意,C#代码从来都不是“非托管的”。它可能“不安全”,但始终是“托管”代码。
fixed (byte* p = Data)
{
*((ushort*)(p + 20)) = X;//x is an ushort
*((ushort*)(p + 22)) = Y;//y is an ushort
}
private byte* Ptr
{
get
{
fixed (byte* p = PData)
return p;
}
}
public unsafe void WriteInt16(ushort val)
{
try
{
*((ushort*)(Ptr + Count)) = val;
Count += 2;
}
catch{}
}
*((ushort*)(p + 20)) = X;
Data[20] = (byte)X;
Data[21] = (byte)(X >> 8);
*((ushort*)(Ptr + Count)) = val;
PData[Count] = (byte)val;
PData[Count + 1] = (byte)(val >> 8);