Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9747

new byte[]が許されるのは...

$
0
0

.net Core 3.1 の C#で byte[]をnewする話。

将来的に何度も検索しそうなのでこちらに抜粋

元記事: LitJWTに見るモダンなC#のbyte[]とSpan操作法

ようするに、今どきnew byte[]なんてしたら殺されるぞ!

とのこと。

C# 7.2からSpan構造体というのが使えるようになったので
unsafe なしで stackalloc を使えるようになりました。

だから new byte[] が許されるのはC#7.2未満というお話

従来の書き方
varbytes=newbyte[Base64.GetMaxBase64UrlDecodeLength(header.Length)];
(データが)あんまり大きくないのが確定してる場合
Span<byte>bytes=stackallocbyte[Base64.GetMaxBase64UrlDecodeLength(header.Length)];

(stackalloc はスタックメモリ(容量はかなり少ない)を使うので、配列の長さが短いもの限定で)

(データが)そこそこ大きいのが来る可能性がある場合
varrentBytes=ArrayPool<byte>.Shared.Rent(Base64.GetMaxBase64UrlDecodeLength(payload.Length));try{Span<byte>bytes=rentBytes.AsSpan();// ....}finally{ArrayPool<byte>.Shared.Return(rentBytes);}

(bytesにデータを流し込んだ後は、.Sliceできちんとサイズ指定して取得します)

(その他参考にさせていただいた記事)

.NET Core 3.0時代のメモリ管理
Spanを使うべき5つの理由
C# - Span のすべて: .NET の新しい頼みの綱を探索する
ReadOnlySequenceについて


Viewing all articles
Browse latest Browse all 9747

Trending Articles