0

在 delphi 的“ZeroMemory”程序中,要求提供两个参数。

代码示例

procedure ZeroMemory(Destination: Pointer; Length: DWORD);
begin
 FillChar(Destination^, Length, 0);
end;

我想在 C# 中制作这个或类似的东西......那么,它们的等价物是什么?

提前致谢!

4

4 回答 4

7

.NET 框架对象始终初始化为已知状态

.NET 框架值类型会自动“归零”——这意味着框架保证在将其返回给您使用之前将其初始化为其自然默认值。由值类型(例如数组、结构、对象)组成的事物的字段也被类似地初始化。

通常,在 .NET 中,所有托管对象都被初始化为默认值,并且永远不会像在其他非托管环境中那样,对象的内容是不可预测的(因为它包含恰好位于该特定内存位置的数据)。

答:您不需要这样做,因为 .NET 会自动为您“归零”对象。但是,您应该知道每种值类型的默认值是什么。例如,a 的默认bool值为 false,an 的默认int值为 0。

非托管对象

“归零”内存区域通常仅在与外部非托管库进行互操作时才需要。

如果您有一个指向内存区域的固定指针,该内存区域包含您打算传递给外部非托管库(例如用 C 编写)的数据,并且您想将该内存部分归零,那么您的指针很可能指向一个字节数组,您可以使用一个简单的 for 循环将其归零。

题外话

另一方面,如果在 .NET 中分配了一个大对象,请尝试重用它,而不是将其丢弃并分配一个新对象。这是因为任何新对象都会被 .NET 框架自动“归零”,而对于大型对象,这种清除将导致隐藏的性能损失。

于 2011-03-18T09:36:55.583 回答
1

您很少需要 C# 中的不安全代码。通常仅在与本机库交互时。

Marshal类作为一些低级辅助函数,但我不知道有任何将内存归零的函数。

于 2011-03-18T09:34:02.150 回答
1

首先,在 .Net(包括 C#)中,值类型默认为零——因此这消除了 ZeroMemory 的常见用途之一。

其次,如果您想将 T 类型的列表归零,请尝试以下方法:

void ZeroMemory<T>(IList<T> destination)
{
    for (var i=0;i<destination.Count; i+))
   {
       destination[i] = default(T);
   }
}

如果列表不可用......那么我想我需要查看更多调用代码。

于 2011-03-18T09:36:08.297 回答
0

从技术上讲,有Array.Clear,但它仅适用于托管数组。你想让我做什么?

于 2011-03-18T09:37:34.523 回答