簡體   English   中英

在C#中等效於Delphi“ ZeroMemory”?

[英]What is the equivalent of Delphi “ZeroMemory” in C#?

在delphi的“ ZeroMemory”過程中,要求兩個參數。

代碼示例

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

我想做到這一點,或在C#中做到類似……所以,它們的等效性是什么?

提前致謝!

.NET框架對象始終被初始化為已知狀態

.NET框架值類型會自動“歸零”-這意味着該框架保證在將其返回給您使用之前,將其初始化為自然的默認值。 由值類型(例如數組,結構,對象)組成的事物的字段也進行了類似的初始化。

通常,在.NET中,所有托管對象都被初始化為默認值,並且從來沒有像其他非托管環境中那樣,對象的內容是不可預測的(因為它包含的數據恰好位於該特定內存位置中)。

答:您不需要這樣做,因為.NET將自動為您將對象“清零”。 但是,您應該知道每種值類型的默認值是什么。 例如,默認的bool是假的,並且一個的默認int是零。

非托管對象

通常僅在與外部非托管庫互操作時才需要“歸零”內存區域。

如果您有一個指向存儲區域的固定指針,該存儲區域包含要傳遞給外部非托管庫的數據(例如,用C編寫),並且您希望將該存儲區清零,則該指針很可能指向一個字節數組,您可以使用簡單的for循環將其歸零。

離題筆記

另一方面,如果在.NET中分配了一個大對象,請嘗試重用它,而不是扔掉它並分配一個新對象。 這是因為.NET框架會自動將任何新對象“置零”,對於大型對象,這種清除將導致性能下降。

您很少需要使用C#中的不安全代碼。 通常僅在與本機庫交互時才使用。

元帥類作為一些低級的輔助函數,但是我不知道有什么會使內存清零的。

首先,在.Net(包括C#)中,默認情況下值類型為零-因此,這消除了ZeroMemory的常見用法之一。

其次,如果您想將T類型的列表歸零,請嘗試以下方法:

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

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

從技術上講,存在Array.Clear ,但僅適用於托管數組。 你想讓我做什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM