有人能举例说明在C#代码中实际使用"不安全"和"修复"的好时机吗?我以前玩过它,但从来没有真正找到它的好用.
考虑这段代码......
fixed (byte* pSrc = src, pDst = dst) {
//Code that copies the bytes in a loop
}
Run Code Online (Sandbox Code Playgroud)
与简单使用...相比
Array.Copy(source, target, source.Length);
Run Code Online (Sandbox Code Playgroud)
第二个是.NET Framework中的代码,第一部分是从Microsoft网站复制的代码,http://msdn.microsoft.com/en-us/library/28k1s2k6(VS.80).aspx.
内置的Array.Copy()比使用Unsafe代码要快得多.这可能只是因为第二个只是更好的编写,第一个只是一个例子,但你真的甚至需要使用不安全/固定代码的什么样的情况?或者,这个可怜的网络开发人员是否在弄乱他的头脑?
在我们的一个项目中,我们有类似的代码.任何人都可以解释(简单英语)为什么需要修复语句?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 是否可以在C#.Net(3.5及更高版本)中将变量复制到byte []缓冲区而不在进程中创建任何垃圾?
例如:
int variableToCopy = 9861;
byte[] buffer = new byte[1024];
byte[] bytes = BitConverter.GetBytes(variableToCopy);
Buffer.BlockCopy(bytes, 0, buffer, 0, 4);
float anotherVariableToCopy = 6743897.6377f;
bytes = BitConverter.GetBytes(anotherVariableToCopy);
Buffer.BlockCopy(bytes, 0, buffer, 4, sizeof(float));
...
Run Code Online (Sandbox Code Playgroud)
创建byte []字节中间对象变为垃圾(假设ref不再持有)...
我想知道如果使用按位运算符,变量可以直接复制到缓冲区而不创建中间字节[]?
按照C#参考的fixed声明:
fixed语句阻止垃圾收集器重定位可移动变量.
...
执行语句中的代码后,将取消固定任何固定变量并进行垃圾回收.因此,不要指向固定语句之外的那些变量.
我的问题是,如果我们fixed对同一个变量有嵌套语句,那么我在这个页面上找不到的内容是什么?
var data = new byte[100];
unsafe
{
fixed(byte* pData = data)
{
//pData points to the "pinned" variable
fixed(byte* pData2 = data)
{
//pData points to the "pinned" variable
//pData2 points to the "pinned" variable
}
//Does pData still point to the "pinned" variable?
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码当然只是为了说明.实际使用可以是递归函数.