Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tip
Nieuw bij het ontwikkelen van software? Begin eerst met de handleiding Aan de slag. U oefent daar basistypen voordat u conversiekeuzes maakt.
Ervaren in een andere taal? C#-conversies werken zoals de meeste statisch getypte talen: verruimende conversies zijn impliciet, vernauwende conversies vereisen expliciete casts, en moet het parseren van tekst de voorkeur geven aan TryParse in code die zich richt op gebruikers.
Wanneer u C#-code schrijft, converteert u vaak waarden van het ene type naar het andere. U kunt bijvoorbeeld converteren van int naar long, tekst lezen en converteren naar een getal of een basistype casten naar een afgeleid type.
Belangrijke termen begrijpen:
- Een conversie is het proces van het wijzigen van een waarde van het ene type naar het andere.
- Een cast is de expliciete syntaxis voor conversie, geschreven met haakjes zoals
(int)value. - Een impliciete conversie is een conversie die automatisch wordt uitgevoerd wanneer de compiler kan garanderen dat deze veilig is.
- Een expliciete cast is een conversie die u in code schrijft, wat aangeeft dat de conversie mogelijk informatie verliest of mislukt.
De conversiestijl aanpassen aan de situatie:
- Impliciete conversies worden automatisch uitgevoerd wanneer de compiler veiligheid kan garanderen. Er is geen syntaxis vereist.
- Expliciete casts zijn vereist wanneer gegevens verloren gaan of de conversie kan mislukken.
- Patroonkoppeling of
asis van toepassing wanneer u een veilige conversie van het verwijzingstype nodig hebt die mogelijk niet slaagt. - Parserings-API's zijn van toepassing wanneer de bronwaarde tekst is.
Impliciete en expliciete numerieke conversies
Een impliciete conversie slaagt altijd. Een expliciete conversie kan mislukken of gegevens verliezen.
int itemCount = 42;
long widened = itemCount; // Implicit conversion.
double average = 19.75;
int truncated = (int)average; // Explicit cast.
Console.WriteLine($"widened: {widened}, truncated: {truncated}");
Een expliciete cast zorgt ervoor dat lezers weten dat de conversie mogelijk informatie verliest. In het voorbeeld wordt de double waarde afgekapt wanneer deze wordt geconverteerd naar int.
Zie Ingebouwde numerieke conversies voor volledige conversietabellen.
Verwijzingen converteren
Klassen zijn referentietypen. Cast-bestanden kopiëren geen gegevens. Ze wijzigen hoe u hetzelfde object bekijkt.
Sommige verwijzingsconversies zijn impliciet. De compiler garandeert dat ze veilig zijn. Drie situaties produceren altijd een impliciete verwijzingsconversie: het toewijzen van een afgeleide klasse-exemplaar aan een basisklassevariabele (het afgeleide type is een subtype van het basistype), het toewijzen van een exemplaar van een verwijzingstype aan een variabele van een interface die door het type wordt geïmplementeerd en het toewijzen van een verwijzingstype aan een object variabele.
Mammal otter = new() { Name = "River otter" };
Animal animal = otter; // Derived to base class: always safe.
INamed named = otter; // Reference type to implemented interface: always safe.
object obj = otter; // Any reference type to object: always safe.
Console.WriteLine(named.Name);
Als u de andere richting gaat, van een basistype terug naar een afgeleid type, moet u een expliciete controle uitvoeren, omdat het object mogelijk niet het afgeleide type is dat u verwacht. Geef de voorkeur aan patroonkoppeling, zodat de test en toewijzing samen plaatsvinden.
Animal knownAnimal = new Mammal { Name = "River otter" };
if (knownAnimal is Mammal mammal)
{
Console.WriteLine($"Pattern match succeeded: {mammal.Name}");
}
Animal unknownAnimal = new Reptile();
Console.WriteLine($"Can treat as mammal: {unknownAnimal is Mammal}");
Bij patroonkoppeling blijft de geslaagde cast-variabele in het kleinste praktische bereik, waardoor de leesbaarheid wordt verbeterd.
Als u een null-resultaat nodig hebt in plaats van een voorwaardelijke vertakking, gebruikt u as:
object boxedMammal = new Mammal { Name = "Sea lion" };
Mammal? maybeMammal = boxedMammal as Mammal;
Console.WriteLine(maybeMammal is null ? "Not a mammal" : maybeMammal.Name);
object boxedReptile = new Reptile();
Mammal? noMammal = boxedReptile as Mammal;
Console.WriteLine(noMammal is null ? "Safe null result" : noMammal.Name);
Gebruik as alleen met referentietypen en null-waardetypen. Het retourneert null wanneer de conversie mislukt.
Meer informatie over boksen en uitpakken
Het boksen converteert een struct of een ander waardetype naar object of naar een geïmplementeerd interfacetype. Unboxing extraheert het waardetype uit die objectverwijzing.
int temperature = 72;
object boxedTemperature = temperature; // Boxing.
int unboxedTemperature = (int)boxedTemperature; // Unboxing.
Packet packet = new(7);
ILabelled labelledPacket = packet; // Boxing through an interface reference.
Console.WriteLine($"Unboxed: {unboxedTemperature}, Label: {labelledPacket.Label}");
Bij boxing wordt geheugen toegewezen aan de beheerde heap en voor het unboxen is een typecontrole vereist. Vermijd onnodige boxing in kritieke paden omdat dit leidt tot onverwachte toewijzingen en extra werk.
Tekst parseren met Parse en TryParse
Wanneer u gebruikersinvoer of bestandsinhoud converteert, begint u met TryParse. Het voorkomt uitzonderingen voor verwachte ongeldige invoer en maakt foutafhandeling expliciet. Alle parse-API's maken een nieuw object- of waardetype-exemplaar uit de brontekenreeks, ze wijzigen de bron niet.
string textValue = "512";
int parsed = int.Parse(textValue);
string userInput = "12x";
bool parsedSuccessfully = int.TryParse(userInput, out int safeValue);
Console.WriteLine($"parsed: {parsed}");
Console.WriteLine(parsedSuccessfully ? $"safe value: {safeValue}" : "Input is not a valid number.");
Gebruik Parse wanneer invoer gegarandeerd geldig is, zoals gecontroleerde testgegevens. Gebruiken TryParse voor gebruikersinvoer, netwerkpayloads en bestandsgegevens.
Kernconversie-API's
Gebruik deze API's meestal in dagelijkse code:
Raadpleeg voor geavanceerd conversiegedrag en alle overbelastingen de API-verwijzing voor het specifieke doeltype.