在德尔福的“ZeroMemory”程序中,要求两个参数。
代码示例
procedure ZeroMemory(Destination: Pointer; Length: DWORD);
begin
FillChar(Destination^, Length, 0);
end;
我想在C#中制作这个或类似的东西......那么,它们的等价物是什么?
提前感谢!
答案 0 :(得分:7)
.NET框架值类型自动“归零” - 这意味着框架保证在将其返回给您使用之前将其初始化为其自然默认值。由值类型(例如数组,结构,对象)组成的事物的字段类似地初始化。
通常,在.NET中,所有托管对象都被初始化为默认值,并且从不存在对象内容不可预测的情况(因为它包含恰好位于该特定内存位置的数据),就像在其他对象中一样非托管环境。
答案:您不需要这样做,因为.NET会自动为您“归零”对象。但是,您应该知道每种值类型的默认值。例如,bool
的默认值为false,int
的默认值为零。
“归零”内存区域通常只有在与外部非托管库互连时才有必要。
如果你有一个指向内存区域的固定指针,该内存区域包含你打算传递给外部非托管库的数据(用C编写,比如说),并且你想要将该部分内存归零,那么你的指针最多可能指向一个字节数组,你可以使用一个简单的for循环将它归零。
另一方面,如果在.NET中分配了一个大对象,请尝试重用它而不是丢弃它并分配一个新对象。这是因为任何新对象都会被.NET框架自动“归零”,对于大型对象,此清除将导致隐藏的性能损失。
答案 1 :(得分:1)
您很少需要C#中的不安全代码。通常仅在与本机库交互时。
Marshal类作为一些低级辅助函数,但我不知道任何内存为零。
答案 2 :(得分:1)
首先,在.Net(包括C#)中,默认情况下值类型为零 - 因此这消除了ZeroMemory的一个常见用途。
其次,如果要将类型T列表归零,请尝试以下方法:
void ZeroMemory<T>(IList<T> destination)
{
for (var i=0;i<destination.Count; i+))
{
destination[i] = default(T);
}
}
如果列表不可用......那么我认为我需要查看更多的调用代码。
答案 3 :(得分:0)
从技术上讲,有Array.Clear
,但它仅适用于托管数组。你想做什么?