2012-01-31 8 views
5

que estaba buscando a través de algún código de hoy y vi algo como lo siguiente:¿Por qué el Diseñador de Windows Forms convierte int en bytes y luego vuelve a int para FromArgb?

var colour = Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(213)))), ((int)(((byte)(193))))); 

Cuando le pregunté por qué era así, ya que ReSharper confirmó que todos los moldes son redundantes, me dijeron que el diseñador hecho de esa camino y ellos habían copiado eso.

He echado un vistazo y, efectivamente, el Diseñador genera el mismo código que el anterior al configurar una propiedad a un color personalizado.

¿Alguien sabe por qué el Diseñador haría esto? No parece tener sentido, a menos que me falta algo?

+3

Puede que te estés perdiendo la feliz historia aquí. Mientras las máquinas escriban código como este, podrás conservar tu trabajo por un tiempo. –

Respuesta

9

Este código es generado automáticamente por el serializador de código integrado en el diseñador de Winforms. El culpable aquí es la clase System.Drawing.ColorConverter, TypeConverter for Color. El código relevante en su método ConvertTo() es:

member = typeof(Color).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int) }); 
    arguments = new object[] { color2.R, color2.G, color2.B }; 

Las propiedades R, G y B devuelven un byte. Entonces el serializador de código primero genera el literal entero y aplica el molde (de bytes) para que coincida con el tipo de argumentos. Luego ve que FromArgb() acepta argumentos enteros, por lo que aplica el molde (int).

Este es solo el código maniacal generado por la máquina. Solo tiene que ser correcto, no tiene que ser bonito.

+1

Esto es lo que estaba buscando, una explicación sobre por qué el diseñador generó un código como este en primer lugar. – Glenn

5

No hay ningún beneficio. Todo lo que hace es hacer que el código sea difícil de leer.

Esto es preferible

var colour = Color.FromArgb(227, 213, 193); 

o incluso la versión canal alfa:

var colour = Color.FromArgb(255, 227, 213, 193); 

Como @Alexei Levenkov señala, tal vez el autor estaba siendo prudente, pero dado el nombre claro del método y su (bien conocido) uso previsto, ¿por qué alguien usaría un valor mayor que 255 para cualquiera de los parámetros?

Ref. Color.FromArgb Method

+0

+1. El primer lanzamiento a byte se puede usar para truncar valores (si los valores no serían constantes), pero no veo ninguna razón para el segundo lanzamiento. –

+0

Pareces pensar que este código fue escrito por un humano. No fue así, el código de diseñador de Winforms está escrito por una máquina. Solo tiene que compilarse, ser guapa no es un requisito. –

+1

@Hans: cuando leí la pregunta "Me dijeron que el diseñador lo hizo de esa manera" lo hizo sonar como "un diseñador", no "el" diseñador. Soy consciente de lo que es el diseñador de Winforms. –