English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Aujourd'hui, en examinant un ancien projet, j'ai vu un code étrange.
if (dto.Payment == null) continue; var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID); dto.Payment = entity?.Payment;
Là une instance de la classe PaymentDTO, dto.Payment est un PaymentDTO.63;.Payment est une instance de la classe Payment, la classe PaymentDTO et la classe Payment n'ont pas de relation de parenté-fille, donc il n'existe pas de conversion implicite entre les sous-classes et les classes parentes.
Curieusement, le compilateur Visual Studio n'a pas signalé d'erreurs de compilation.
Après avoir ouvert la définition de la classe PaymentDTO, j'ai trouvé les signatures de méthode suivantes.
public static implicit operator PaymentDTO(Payment payment)
Sur le plan de la signature de la méthode, c'est une redéfinition de l'opérateur PaymentDTO, mais ce n'est pas celui que j'utilisais auparavant+,-,*,/, ==, etc.
Après avoir consulté MSDN, j'ai appris que implicit et explicit sont un couple d'opérateurs de conversion.
Implicit et Explicit
Implicit
La clé mot 'Implicit' est utilisée pour déclarer un opérateur de conversion utilisateur-défini implicite. Il peut réaliser2Différentes conversions implicites entre classes différentes, améliore la lisibilité du code. Cependant, il faut noter que l'utilisation de l'opérateur de conversion implicite fait sauter le contrôle des exceptions lors de la compilation, donc l'opérateur de conversion implicite ne doit pas lever d'exceptions et ne doit pas perdre d'informations, sinon des problèmes imprévus peuvent se produire lors de l'exécution.
Par exemple, la définition actuelle de PaymentDTO et Payment est la suivante
public class Payment { public decimal Amount { get; set; } } public class PaymentDTO { public string AmountString { get; set; } }
Si vous devez convertir Payment en PaymentDTO de manière implicite, il suffit de déclarer l'opérateur de conversion implicite de PaymentDTO
public class PaymentDTO { public string AmountString { get; set; } public static implicit operator PaymentDTO(Payment payment) { return new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
Lors de l'appel, il suffit de l'affecter directement
class Program { static void Main(string[] args) { PaymentDTO dto = new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Explicit
La clé mot 'Explicit' déclare un opérateur de conversion utilisateur-défini appelé via une conversion. Contrairement à la conversion implicite, l'opérateur de conversion explicite doit être appelé via une conversion. Si la conversion explicite manque, une erreur se produira lors du compilation.
Par exemple, maintenant nous allons changer l'opérateur de conversion défini précédemment dans la classe PaymentDTO de Implicit à Explicit
public class PaymentDTO { public string AmountString { get; set; } public static explicit operator PaymentDTO(Payment payment) { return new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
Dans ce cas, en raison du manque de conversion explicite dans la méthode Main, le compilateur génère une erreur, indiquant Cannot implicitly convert type 'ExplicitImplicit.Payment' to 'ExplicitImplicit.PaymentDTO'. An explicit conversion exists (are you missing a cast63;)
Pour que le compilateur puisse passer, il suffit d'effectuer une conversion explicite
class Program { static void Main(string[] args) { PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Résumé
Implicite améliore la lisibilité du code, mais les programmeurs doivent s'assurer eux-mêmes que la conversion ne provoque pas d'exceptions et ne perd pas d'informations
Explicite peut empêcher le compilateur d'appeler silencieusement des opérations de conversion qui pourraient entraîner des conséquences imprévues.
Le premier est plus facile à utiliser, le second peut clairement indiquer à tout le monde qui lit le code que vous souhaitez convertir le type
Voici le contenu complet de l'utilisation explicite et implicite dans C# que nous avons rassemblé pour vous. Vous pouvez vous référer à de nombreux exemples pendant l'apprentissage, merci de votre soutien au tutoriel d'extase.
Déclaration : Le contenu de cet article est tiré d'Internet, la propriété intellectuelle appartient à ses auteurs respectifs, le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, ni n'assume la responsabilité des responsabilités juridiques associées. Si vous trouvez du contenu présumé comme étant en violation de copyright, vous êtes invité à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation et fournir des preuves. Une fois vérifié, ce site supprimera immédiatement le contenu présumé comme étant en violation de copyright.)