Ответ 1
Попробуйте Array.Clear():
Устанавливает диапазон элементов в массиве до нуля, до
false
илиnull
(Ничего в Visual Basic), в зависимости от по типу элемента.
В настоящее время я делаю это в цикле for, и я знаю, что на C существует API ZeroMemory, однако это не похоже на С#. Также не существует несколько эквивалентных Array.fill из Java. Мне просто интересно, есть ли более простой/быстрый способ?
Попробуйте Array.Clear():
Устанавливает диапазон элементов в массиве до нуля, до
false
илиnull
(Ничего в Visual Basic), в зависимости от по типу элемента.
С++: memset(array, 0, array_length_in_bytes);
С++ 11: array.fill(0);
С#: Array.Clear(array, startingIndex, length);
Java: Arrays.fill(array, value);
Array.Clear(integerArray, 0, integerArray.Length);
Несколько человек разместили ответы, а затем удалили их, указав, что на любом языке цикл for будет в равной степени исполняться как memset или FillMemory или что-то еще.
Например, компилятор может вырезать его в 64-разрядные выровненные фрагменты, чтобы воспользоваться 64-разрядной командой присваивания нуля, если она доступна. При этом учитывается согласование и прочее. Внедрение Memset, конечно, не тривиально.
one memset.asm. Также см. memset-is-faster-than-simple-loop.html.
Никогда не недооценивайте бесконечную склонность компилятора и стандартных библиотек.
Вы можете написать один раз Помощник для выполнения этой задачи, например:
public static class ArrayHelper
{
public static void SetToDefaults<T>(this T[] array)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = default(T);
}
}
}
Использование:
someArray.SetToDefaults();
Вызов метода с помощью dll import.It быстрый и простой в использовании:)
[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, int byteCount);
c - значение, которое вы хотите установить в памяти
ИЛИ
[DllImport("kernel32.dll", EntryPoint="RtlZeroMemory")]
public unsafe static extern bool ZeroMemory(byte* destination, int length);
это только задает заданный массив нулю