Подтвердить что ты не робот

С# MemoryStream vs Byte Array

У меня есть функция, которая генерирует и возвращает MemoryStream. После поколения размер MemoryStream исправлен, мне больше не нужно писать, но требуется только выход. Напишите в MailAttachment или напишите в базу данных, например.

Каков наилучший способ передать объект? MemoryStream или байт-массив? Если я использую MemoryStream, я должен reset позицию после чтения.

4b9b3361

Ответ 1

Если вам нужно хранить все данные в памяти, то во многих случаях выбор произволен. Если у вас есть существующий код, который работает на Stream, тогда MemoryStream может быть более удобным, но если вы вернете byte[], вы всегда можете просто обернуть его в new MemoryStream(blob).

Это может также зависеть от того, насколько оно велико и как долго вы его держите; MemoryStream может быть увеличен, что имеет свои преимущества и недостатки. Принуждение к byte[] может быть полезно, если вы некоторое время держите данные, так как он обрезает лишнее; однако, если вы только сохраняете это вкратце, это может быть контрпродуктивным, поскольку это заставит вас дублировать большинство (при абсолютном минимуме: половина) данных при создании новой копии.

Итак, это зависит от контекста, использования и намерения. В большинстве сценариев может быть достаточно "того, что работает, и ясного и простого". Если данные особенно велики или удерживаются в течение длительного периода времени, возможно, вы захотите немного изменить его.

Еще одно преимущество подхода byte[]: при необходимости несколько потоков могут получить к нему доступ безопасно сразу (пока они читают) - это не относится к MemoryStream. Однако это может быть ложным преимуществом: большинству кода не требуется доступ к byte[] из нескольких потоков.

Ответ 2

Класс MemoryStream используется для добавления элементов в поток. Есть указатель файла; Он имитирует произвольный доступ, он зависит от того, как он реализован. Поэтому MemoryStream не предназначен для доступа к любому элементу в любое время.

Байт-массив позволяет произвольный доступ к любому элементу в любое время, пока он не назначен.

Рядом с байтом [] MemoryStream живет в памяти (в зависимости от имени класса). Тогда максимальный размер размещения составляет 4 ГБ.

Наконец, используйте байт [], если вам нужно получить доступ к данным по любому номеру индекса. В противном случае MemoryStream предназначен для работы с чем-то другим, для которого требуется поток в качестве входного сигнала, когда у вас есть только строка.

Ответ 3

Используйте byte [], потому что это объект фиксированного размера, который облегчает распределение и очистку памяти и не содержит никаких накладных расходов - тем более что вам не нужно использовать функции MemoryStream. Кроме того, вы хотите избавиться от этого потока как можно скорее, чтобы он мог высвободить возможные неуправляемые ресурсы, которые он может использовать.