Uso l'analisi del codice statico nei nostri progetti per verificare la presenza di violazioni del codice. Una delle regole ampiamente utilizzate è CA2213, che controlla il corretto smaltimento dei campi usa e getta.Regola di analisi del codice CA2213 e proprietà auto-implementate
Ho notato che CA2213 non controlla lo smaltimento delle proprietà implementate automaticamente.
Inoltre CA2213 non controlla lo smaltimento di nessuno dei campi né delle proprietà autoattive se la classe eredita dalla classe che implementa IDisposable e non sovrascrive il metodo Dispose.
Esempio pratico:
public sealed class Good : IDisposable {
private Font font;
public Font Font {
get { return font; }
set { font = value; }
}
public Good() { font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // CA2213
}
public sealed class Bad : IDisposable {
public Font Font { get; set; }
public Bad() { Font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // No warning
}
Qualcun altro ha incontrato questo comportamento? È questo in base alla progettazione o al bug nella regola CA2213?
Nel caso in cui si elenchino, Code Analysis richiede comunque di gestire 'f' in qualche modo, di solito eliminando manualmente e notando nella giustificazione che il campo iniettato non è di proprietà della classe corrente. Questa è una soluzione eccellente per me. Ciò che non è una buona soluzione non mostra affatto il problema dell'analisi del codice, semplicemente perché 'f' è un autoproperty o perché FieldIsInjected deriva da una classe IDisposable e non sovrascrive Dispose (bool) –