2017-12-11 6 views
1

私はこれを見つけたので、なぜループ内の変数にメモリ割り当てがあるのだろうと思います(.... 0x20;)。変数が単に空白で埋められているようです。しかし、バイト変数をサイズで初期化するとき、なぜこれを行うのでしょうか?この変数にスペースを割り当てるのはなぜですか?

long fileByteLength = package.Properties.Length; 
byte[] fileContent = new byte[fileByteLength]; 
for (int i = 0; i < fileByteLength; i++) 
{ 
    fileContent[i] = 0x20; 
} 
// Download the file aa a byteArray to the fileContent variable 
package.DownloadToByteArray(fileContent, 0); 
+0

'package'とは何ですか? [mcve]を入力してください。 – nvoigt

+0

パッケージが何であるかは本当に重要ではありません。問題は、変数のメモリ割り当てと、なぜそれがこのように見えるかということです。 – user3633222

+0

重要でない場合は、コードブロック全体を削除して満足してください。 – nvoigt

答えて

3

明らかな答えは、プログラマがスペースでいっぱいにしたかったからです。長さを指定して初期化すると、0バイトが大きくなります。なぜプログラマはスペースを必要としたのですか?何も思いつきません。すべてが悪いカーゴ・カルト・プログラミングです(他の誰かがそれをやっているのを見て、それがどのように働いているのか、それが何をしているのか分からずに誰かがそれをしたことを意味します)。

streamを使用するか、return value of that methodを使用してください。品質ガイドラインが「良いプログラミング」の場合、そのループを削除して上記のいずれかのソリューションに置き換える必要があります。

私の好みは、バイトカウントとバッファシフトと戻り値チェックのすべてを取り除くためのストリームです(MemoryStreamでも可能です)。それがストリーム抽象化のためのものです。

+0

ありがとう!速度/最適化の問題でしょうか? – user3633222

+1

私はそれを疑う。とにかく上書きされます。唯一の肯定的な効果は、* less *バイトが書き込まれていても、配列*が最後に空白で埋められていることです。しかし、再び...戻り値を無視し、あらかじめ空白を埋めておくことは、それを処理する最も厄介な方法です。 80年代のCのように、プログラマはAPIの半分しか読まず、それを「最適化」することに決めました。それは最適化されていない、それは単に間違っている。 – nvoigt

+0

特に、データがテキストの場合、これは「動作している」(動作しているとは思えませんが、私が意味することは分かります)最後に空白を追加すると、他のすべてのもの(イメージ、ファイル、データなど)は深刻に壊れてしまいます。 – nvoigt

関連する問題