Questo metodo di estensione è meglio di un semplice casting su un int?

2

Il seguente metodo di estensione è stato impostato in alcuni codici che mantieni.

public static Int32 GetInt32(this System.Data.Common.DbDataReader reader, string name)
{
   return reader.GetInt32(reader.GetOrdinal(name));
}

Che viene quindi chiamato in questo modo:

int field1 = dr.GetInt32("field1");

È davvero meglio di un semplice casting per un int in questo modo:

int field1 = (int)dr["DiskGroupNum"];
    
posta Kevin 31.10.2014 - 17:19
fonte

3 risposte

7

C'è una differenza fondamentale qui. In un caso dici "Assumo solo che questo è un int ", e nel primo caso chiedi al lettore di darti un int . Se il valore è già un int , non mi aspetterei alcuna difficoltà. Tuttavia, cosa succede quando il valore è un Int64 ? Lo stai trasmettendo a un int che è lungo solo 4 byte. Potresti ricevere sorprese inaspettate in questo modo se sei fortunato . Se non lo sei, il programma continua come se nulla fosse accaduto e finisci con un valore mancante dei suoi 4 byte superiori.

Tuttavia se chiedi al lettore di darti un Int32 , vedrai che si lamenterà se ci sono dei problemi nel farlo. Potrebbe sembrare un codice di scrittura contrario creare potenzialmente eccezioni, ma in definitiva funziona a tuo favore, fidati di me. Anche se qualcosa non funziona quando non te lo aspetti, l'errore è chiaro e può essere risolto facilmente.

Se hai un valore che non riflette ciò che viene letto, potrebbe causare problemi altrove nel tuo programma e lasciarti grattando la testa sul perché.

    
risposta data 31.10.2014 - 17:59
fonte
1

In realtà, andrei con una terza opzione. Recupera la colonna ordinale in anticipo e usa i sovraccarichi ordinali. In ogni caso in cui hai più righe, salva il lavoro:

var ord_field1 = dr.GetOrdinal("field1");

while(dr.Read())
{
    ...
    var field1 = dr.GetInt32(ord_field1);
    ...
}
    
risposta data 31.10.2014 - 18:51
fonte
0

No, non è meglio che lanciare su int (a mio parere).

Nel tuo esempio specifico, dr["DiskGroupNum"] restituisce il tipo object , il che significa che il tuo secondo esempio:

int field1 = (int)dr["DiskGroupNum"];

In realtà stai annullando la selezione di object per digitare int , che ti darà InvalidCastException se non è esattamente di tipo int ( Int32 in modo specifico).

Perché penso che non sia utile avere un metodo di estensione per farlo è:

  1. È più scritto
  2. È più codice da eseguire il debug
  3. Dovrai scrivere un codice specifico per tipi diversi
risposta data 31.10.2014 - 20:02
fonte

Leggi altre domande sui tag