2009-12-17 13 views

risposta

44

Si dovrebbe evitare di preoccuparsi per le implicazioni sulle prestazioni di caratteristiche linguistiche specifiche a meno che non si dispone di prove specifiche (misure) che essi sono effettivamente causando un problema.

Le vostre preoccupazioni principali dovrebbero essere la correttezza del codice e la sua manutenibilità.

Come osservazione generale, tuttavia, fusione inutile può spesso essere evitato in C# solo mediante l'applicazione di buone pratiche di programmazione OO e l'utilizzo di farmaci generici (in particolare le collezioni) in modo appropriato. Nei casi in cui è necessario eseguire il cast, è altamente improbabile che si verifichi un collo di bottiglia delle prestazioni a meno che non lo si faccia in un ciclo stretto o con tipi che potrebbero generare un'eccezione di cast non valida.

La maggior parte dei problemi relativi alle prestazioni del mondo reale emerge dalle scelte dell'algoritmo o dalla mancanza di consapevolezza della piattaforma stessa, non dalle specifiche caratteristiche del linguaggio.

+50

Forse potresti aggiungere una piccola cosa alla fine __del sovraccarico di type casting__. È bello avere un consiglio, ma non risponde alla domanda. –

+0

Una buona risposta a una domanda diversa. – Acidic

18

No, non dovrebbe essere evitato a tutti i costi. La fusione non è molto costosa. Ovviamente, se si dispone di un ciclo che viene eseguito un milione di volte al secondo, potrebbe essere opportuno evitare il cast per risparmiare alcune prestazioni, altrimenti non causerà problemi di prestazioni.

Il vero problema con il casting è che si tratta della sicurezza del tipo di imbroglione. Se non si presta attenzione, non è troppo difficile introdurre bug o diminuire la leggibilità del codice se si lanciano oggetti dappertutto.

4

Se è possibile utilizzare i generici, è una soluzione migliore rispetto al casting. Boxing e Unboxing sono operazioni costose che dovrebbero essere evitate se possibile. A volte il problema non può essere evitato.

Anche l'altra risposta ha indicato che preoccuparsi di qualcosa come il pugilato è molto banale rispetto a problemi di prestazioni specifici o manutenibilità del codice. Sono completamente d'accordo con questo.

+1

Non penso che la boxe si applichi qui perché OP sta chiedendo di trasmettere l'oggetto all'oggetto, non il valore all'oggetto. –

2

In genere, il costo del casting di un oggetto su base ad hoc è basso nella grande scala delle cose. Tuttavia, se lanci ripetutamente degli oggetti molte volte, allora è quando dovresti cercare di evitarlo se trovi che è una causa di un problema di prestazioni.

Dopo tutto, uno dei principali miglioramenti da .NET 1.1 a 2.0 è stata l'introduzione di farmaci generici - questo ha affrontato il tema della fortemente tipizzato liste di oggetti (ad esempio ArrayList = basata su oggetti, List = Lista digitato)

Problemi correlati