1

私はそれを完全に割り当てなしにするという使命を持ってライブラリを書き直しています。目標は、アプリの起動フェーズが完了した後、コレクションを0にすることです。

以前は、次のような呼び出しがたくさんありました。

Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));

これは文字列を割り当てることだと思います。同じことを自動的に行うC#ライブラリ関数が見つかりませんでした。BitConverterクラスを見ましたが、それはInt32がそれを表す実際のバイトでエンコードされている場合のみのようです。ここに、Int32を表すASCII文字を表すバイトの配列があります。

これが私がしたことです

public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length)
{
     Int32 Temp = 0;
     Int32 Result = 0;
     Int32 j = 1;

     for (int i = start + length - 1; i >= start; i--)
     {
          Temp = ((Int32)bytes[i]) - 48;

          if (Temp < 0 || Temp > 9)
          {
               throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32");
          }

          Result += Temp * j;
          j *= 10;
     }

     return Result;
}

より最適な方法でこれをすでに実行しているC#ライブラリ関数を知っている人はいますか?または、上記の実行を高速化するための改善(おそらく、1日の間に何百万回も呼び出されるでしょう)。ありがとう!

4

1 に答える 1

5

1日に何百万回も問題になることはないはずです。1秒間に数十万回実行できると期待しています。個人的には、ループ内で「temp」のみを宣言するように上記を書き直します(そして、Pascalの場合はローカル変数名を削除します-うーん)、それは問題ないはずです。

コードは次のようにすぐに理解できます。

int digit = bytes[i] - '0';

これはあなたと同じことをします

Temp = ((Int32)bytes[i]) - 48;

行ですが、より簡単な方法で(IMO)。それらはまったく同じように動作する必要があります。

一般的に、割り当てなしでC#を作成しようとすると、かなり過酷になり、言語とフレームワークの設計方法と戦うことになります。これは実際には合理的な要件だと思いますか?確かに、一部のゲームがマネージコードで記述されている方法だと聞いたことがありますが、少し奇妙に思えます。

もちろん、バイトが不適切な場合は例外を割り当てることになります...

編集:あなたのコードは負の数を許可しないことに注意してください。それは大丈夫ですか?

于 2010-03-26T12:27:31.173 に答える