CA1800: No convertir innecesariamente
Elemento | Valor |
---|---|
RuleId | CA1800 |
Category | Microsoft.Performance |
Cambio importante | Poco problemático |
Causa
Un método realiza conversiones duplicadas en uno de sus argumentos o variables locales.
Para realizar un análisis completo mediante esta regla, el ensamblado probado debe compilarse mediante la información de depuración y el archivo de base de datos de programa (.pdb) asociado debe estar disponible.
Nota
Esta regla está en desuso. Para más información, consulte Reglas en desuso.
Descripción de la regla
Las conversiones duplicadas reducen el rendimiento, sobre todo cuando se realizan en instrucciones de iteración compactas. Para las operaciones de conversión duplicadas explícitas, almacene el resultado de la conversión en una variable local y use la variable local en lugar de las operaciones de conversión duplicadas.
Si el operador de C# is
se usa para probar si la conversión se realiza correctamente antes de que tenga lugar la conversión real, considere la posibilidad de probar mejor el resultado del operador as
. Este proporciona la misma funcionalidad sin la operación de conversión implícita que realiza el operador is
. O bien, en C# 7.0 y versiones posteriores, use el operador is
con coincidencia de patrones para comprobar la conversión de tipos y convertir la expresión en una variable de ese tipo en un paso.
Cómo corregir infracciones
Para corregir una infracción de esta regla, modifique la implementación del método para minimizar el número de operaciones de conversión.
Cuándo suprimir las advertencias
Es seguro suprimir una advertencia de esta regla, u omitir la regla por completo, si no le preocupa el rendimiento.
Ejemplos
En el ejemplo siguiente se muestra un método que infringe la regla mediante el operador de C# is
. Un segundo método satisface la regla al sustituir el operador is
por una prueba contra el resultado del operador as
, lo que disminuye el número de operaciones de conversión por iteración de dos a una. Un tercer método también satisface la regla al usar is
con la coincidencia de patrones para crear una variable del tipo deseado si la conversión de tipos se realiza correctamente.
using System;
using System.Collections;
using System.Windows.Forms;
namespace PerformanceLibrary
{
public sealed class SomeClass
{
private SomeClass() {}
// This method violates the rule.
public static void UnderPerforming(ArrayList list)
{
foreach(object obj in list)
{
// The 'is' statement performs a cast operation.
if(obj is Control)
{
// The 'as' statement performs a duplicate cast operation.
Control aControl = obj as Control;
// Use aControl.
}
}
}
// This method satisfies the rule.
public static void BetterPerforming(ArrayList list)
{
foreach(object obj in list)
{
Control aControl = obj as Control;
if(aControl != null)
{
// Use aControl.
}
}
}
}
}
En el ejemplo siguiente se muestra un método, start_Click
, con varias conversiones explícitas duplicadas, que infringe la regla y un método, reset_Click
, que satisface la regla al almacenar la conversión en una variable local.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace PerformanceLibrary
{
public class SomeForm : Form
{
Button start, reset;
public SomeForm()
{
start = new Button();
reset = new Button();
start.Click += new EventHandler(start_Click);
reset.Click += new EventHandler(reset_Click);
Controls.Add(start);
Controls.Add(reset);
}
// This method violates the rule.
void start_Click(object sender, EventArgs e)
{
Size controlSize = ((Control)sender).Size;
RightToLeft rightToLeftValue = ((Control)sender).RightToLeft;
Control parent = (Control)sender;
}
// This method satisfies the rule.
void reset_Click(object sender, EventArgs e)
{
Control someControl = (Control)sender;
Size controlSize = someControl.Size;
RightToLeft rightToLeftValue = someControl.RightToLeft;
Control parent = someControl;
}
}
}
Vea también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de