Pregunta

Estoy a Biblioteca re-escrito con un mandato para que sea totalmente libre asignación. El objetivo es tener 0 colecciones después de la fase de inicio de la aplicación se realiza.

Anteriormente, había una gran cantidad de llamadas de esta manera:

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

Lo que yo creo es la asignación de una cadena. No pude encontrar una función de biblioteca C # que hacer lo mismo de forma automática. Miré a la clase BitConverter, pero parece que esto es sólo si su Int32 está codificado con los bytes que la representan. Aquí, tengo una matriz de bytes que representan caracteres ASCII que representan un Int32.

Esto es lo que hice

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;
}

¿Alguien sabe de una función C # biblioteca que ya lo hace de una manera más óptima? O una mejora para hacer la carrera anterior más rápido (que va a ser llamado millones de veces durante el día, probablemente). ¡Gracias!

¿Fue útil?

Solución

Millones de veces por día no debería ser un problema - yo esperaría que para ser capaz de ejecutar cientos de miles de veces por segundo. En lo personal me gustaría volver a escribir lo anterior para declarar solamente "temp" dentro del bucle (y deshacerse de los casos Pascal-nombres de variables locales - Urgh). Pero debe estar bien

El código sería más inmediatamente comprensible, ya que:

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

, que hace lo mismo que su

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

línea, pero de una manera más simple (OMI). Estos deben comportarse de la misma manera.

En términos generales, intentando escribir C # sin ningún tipo de asignaciones es bastante duro, y lucha contra la forma en que el lenguaje y el marco están diseñados. ¿Usted cree que esto es realmente un requisito razonable? Es cierto que he oído acerca de que sea la forma en que algunos juegos están escritos en código administrado ... pero parece un poco extraño.

Por supuesto, va a destinar una excepción si los bytes no son adecuadas ...

EDIT: Tenga en cuenta que el código no permite para los números negativos. ¿Está bien?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top