Если вы передадите byte[]
в MemoryStream
, то он будет первоначально копировать данные (в конструкторе), но до тех пор, пока вы освобождаете byte[]
, он может собирать мусор. По сути, нет «удвоения» (особенно, если вы можете правильно установить размер для начала и писать прямо в Stream
, а не byte[]
).
Я бы полностью сказал, переключитесь на Stream
(но только использует Stream
в API - ничего особенного; ваш потребительский код не должен знать, какой тип). Самое главное, вы можете выбрать NetworkStream
(для чтения непосредственно из сокета) или FileStream
(если вы хотите выполнить буферизацию на диск), или MemoryStream
, если вы хотите буферизовать в процессе. Вам также необходимо убедиться, что вы читаете этот объем данных с помощью потокового кода. Блоки итераторов (yield return
) могут быть очень полезны здесь, как и методы LINQ Enumerable
(за исключением OrderBy
, GroupBy
и т. Д., Которые буферизуют).
Ни передача byte[]
, ни передача Stream
не приводит к копированию чего-либо, так как они являются ссылочными типами - единственное, что копируется - это ссылка (4 или 8 байтов, в зависимости от x86 / x64).