English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Oggi, mentre Reviewavo un vecchio progetto, ho visto un pezzo di codice strano.
if (dto.Payment == null) continue; var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID); dto.Payment = entity?.Payment;
Dove dto.Payment è un'istanza della classe PaymentDTO, entity?.Payment è un'istanza della classe Payment, la classe PaymentDTO e la classe Payment non hanno relazione di superclasse/sottoclasse, quindi non esiste una conversione implicita tra sottoclasse e superclasse.
Stranamente, il compilatore di Visual Studio non ha segnalato alcun errore di compilazione.
Aperto la definizione della classe PaymentDTO, ho trovato le seguenti firme dei metodi.
public static implicit operator PaymentDTO(Payment payment)
Secondo la firma del metodo, questo è un sovraccarico dell'operatore PaymentDTO, ma non è come +, -, *, /, == che utilizzavo prima.
Dopo aver consultato MSDN, ho scoperto che implicit e explicit sono un paio di operatori di conversione.
Implicit e Explicit
Implicit
La parola chiave Implicit deklara l'operatore di conversione utente definito implicito che può implementare la conversione implicita tra due classi diverse, migliorando la leggibilità del codice. Tuttavia, è necessario notare che dopo l'uso dell'operatore di conversione implicito, la compilazione salterà il controllo delle eccezioni, quindi l'operatore di conversione implicito dovrebbe non sollevare eccezioni e non perdere informazioni; altrimenti, si possono verificare problemi inaspettati durante l'esecuzione.
Ad esempio, la definizione attuale di PaymentDTO e Payment è la seguente
public class Payment { public decimal Amount { get; set; } } public class PaymentDTO { public string AmountString { get; set; } }
Se si desidera convertire implicitamente Payment in PaymentDTO, è sufficiente dichiarare l'operatore di conversione implicito di PaymentDTO
public class PaymentDTO { public string AmountString { get; set; } public static implicit operator PaymentDTO(Payment payment) { return new PaymentDTO { AmountString = payment.Amount.ToString("C2") }; } }
Durante la chiamata è sufficiente assegnare direttamente
class Program { static void Main(string[] args) { PaymentDTO dto = new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Explicit
La parola chiave Explicit deklara l'operatore di conversione utente definito che deve essere chiamato tramite conversione. A differenza della conversione implicita, l'operatore di conversione esplicita deve essere chiamato tramite conversione; se manca la conversione esplicita, si genererà un errore durante la compilazione.
Ad esempio, ora stiamo cambiando l'operatore di conversione definito nella classe PaymentDTO da Implicit a Explicit
public class PaymentDTO { public string AmountString { get; set; } public static explicit operator PaymentDTO(Payment payment) { return new PaymentDTO { AmountString = payment.Amount.ToString("C2") }; } }
In questo caso, poiché il metodo Main non contiene conversione esplicita, il compilatore genera un errore, indicando Cannot implicitly convert type 'ExplicitImplicit.Payment' to 'ExplicitImplicit.PaymentDTO'. An explicit conversion exists (are you missing a cast?)
Per far si che il compilatore possa compilare, è sufficiente fare una conversione esplicita
class Program { static void Main(string[] args) { PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Conclusione
L'implicito migliora la leggibilità del codice, ma il programmatore deve garantire che la conversione non generi eccezioni e non perda informazioni
L'esplicito può prevenire che il compilatore chiami silenziosamente operazioni di conversione che potrebbero avere conseguenze impreviste
Il primo è più facile da usare, il secondo indica chiaramente a chi legge il codice che si desidera convertire il tipo
Ecco tutto il contenuto che abbiamo raccolto sull'uso esplicito e implicito in C#, puoi fare riferimento agli esempi durante lo studio, grazie per il tuo supporto al tutorial Yelling.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è di proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.