質問

私はそれが完全に割り当て自由にするために任務をalibraryを再書いています。目標は、アプリケーションの起動フェーズが完了した後、0のコレクションを持つことです。

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

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

私は、文字列を割り当てていると信じています。私は、自動的に同じことをするだろうC#のライブラリ関数を見つけることができませんでした。私は、BitConverterクラスを見て、それがあなたのInt32がそれを表している実際のバイトでエンコードされている場合のみであるように見えます。ここで、Iの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#ライブラリ関数の

んと誰が知っていますか?あるいは、上記の実行が速く(そのおそらく日中の何百万回と呼ばれることになるだろう)ようにする改良。ありがとう!

役に立ちましたか?

解決

一日あたり数百万回は問題にはならない - 私はそれが毎秒数十万回を実行できるように期待したいです。個人的に私はループ内で「TEMP」を宣言するために、上記書き換えたい(とパスカルの場合、ローカル変数名を取り除く - urgh)。しかし、それは大丈夫でなければなりません。

は、コードをよりすぐに理解できるようになります:

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

あなたの

と同じ処理を行い
Temp = ((Int32)bytes[i]) - 48;

行が、簡単な方法(IMO)インチ彼らはまったく同じように振る舞うべきます。

一般的なノートでは、任意の割り当てなしのC#を書き込もうとすると、かなり厳しいですし、言語やフレームワークが設計されている方法と戦います。あなたは、これはの実際の合理的な要件であると考えていますか?確かに私はそれはいくつかのゲームは、マネージコードで書かれている方法であることについて聞いた...しかし、それは少し奇妙に思えるん。

バイトが不適切な場合もちろん、あなたが例外を割り当てるつもりだ...

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top