Delen via


Een rondleiding door de C#-taal

De C#-taal is de populairste taal voor het .NET-platform, een gratis, platformoverschrijdende opensource-ontwikkelomgeving. C#-programma's kunnen worden uitgevoerd op veel verschillende apparaten, van IoT-apparaten (Internet of Things) naar de cloud en overal daartussen. U kunt apps schrijven voor telefoon-, desktop- en laptopcomputers en -servers.

C# is een platformoverschrijdende taal voor algemeen gebruik waarmee ontwikkelaars productief zijn tijdens het schrijven van zeer goed presterende code. Met miljoenen ontwikkelaars is C# de populairste .NET-taal. C# biedt brede ondersteuning in het ecosysteem en alle .NET-workloads. Op basis van objectgeoriënteerde principes bevat het veel functies van andere paradigma's, niet de minste functionele programmering. Functies op laag niveau bieden ondersteuning voor scenario's met hoge efficiëntie zonder onveilige code te schrijven. De meeste .NET-runtime en -bibliotheken zijn geschreven in C#, en de ontwikkelingen in C# profiteren vaak van alle .NET-ontwikkelaars.

Hallo wereld

Het programma Hello, World wordt traditioneel gebruikt om een programmeertaal te introduceren. Hier bevindt het zich in C#:

// This line prints "Hello, World" 
Console.WriteLine("Hello, World");

De regel begint met // één regel als opmerking. C# opmerkingen met één regel beginnen met // en doorgaan naar het einde van de huidige regel. C# ondersteunt ook opmerkingen met meerdere regels. Opmerkingen met meerdere regels beginnen met /* en eindigen met */. De WriteLine methode van de Console klasse, die zich in de System naamruimte bevindt, produceert de uitvoer van het programma. Deze klasse wordt geleverd door de standaardklassebibliotheken, die standaard automatisch worden verwezen in elk C#-programma.

In het voorgaande voorbeeld ziet u één vorm van een 'Hallo wereld'-programma met behulp van instructies op het hoogste niveau. In eerdere versies van C# moet u het toegangspunt van het programma definiëren in een methode. Deze indeling is nog steeds geldig en u ziet deze in veel bestaande C#-voorbeelden. U moet ook bekend zijn met dit formulier, zoals wordt weergegeven in het volgende voorbeeld:

using System;

class Hello
{
    static void Main()
    {
        // This line prints "Hello, World" 
        Console.WriteLine("Hello, World");
    }
}

In deze versie ziet u de bouwstenen die u in uw programma's gebruikt. Het programma Hello, World begint met een using instructie die verwijst naar de System naamruimte. Naamruimten bieden een hiërarchische middelen voor het ordenen van C#-programma's en bibliotheken. Naamruimten bevatten typen en andere naamruimten, bijvoorbeeld de System naamruimte bevat veel typen, zoals de Console klasse waarnaar in het programma wordt verwezen, en veel andere naamruimten, zoals IO en Collections. Een using instructie die verwijst naar een bepaalde naamruimte maakt niet-gekwalificeerd gebruik mogelijk van de typen die lid zijn van die naamruimte. Vanwege de using richtlijn kan het programma als verkorte Console.WriteLine gebruiken.System.Console.WriteLine In het eerdere voorbeeld is die naamruimte impliciet opgenomen.

De Hello klasse die is gedeclareerd door het programma Hello, World, heeft één lid, de methode met de naam Main. De Main methode wordt gedeclareerd met de static modifier. Hoewel exemplaarmethoden kunnen verwijzen naar een bepaald objectexemplaren met behulp van het trefwoord this, werken statische methoden zonder verwijzing naar een bepaald object. Wanneer er geen instructies op het hoogste niveau zijn, fungeert een statische methode die wordt genoemd Main als het toegangspunt van een C#-programma.

Beide invoerpuntformulieren produceren equivalente code. Wanneer u instructies op het hoogste niveau gebruikt,synthetiseert de compiler de bevatde klasse en methode voor het toegangspunt van het programma.

Tip

De voorbeelden in dit artikel geven u een eerste blik op C#-code. Sommige voorbeelden bevatten mogelijk elementen van C# waarmee u niet bekend bent. Wanneer u klaar bent om C# te leren, begint u met onze zelfstudies voor beginners of duikt u in de koppelingen in elke sectie. Als u ervaring hebt met Java, JavaScript, TypeScript of Python, leest u onze tips om u te helpen de informatie te vinden die u nodig hebt om snel C# te leren.

Vertrouwde C#-functies

C# is geschikt voor beginners, maar biedt geavanceerde functies voor ervaren ontwikkelaars die gespecialiseerde toepassingen schrijven. U kunt snel productief zijn. U kunt meer gespecialiseerde technieken leren, omdat u deze nodig hebt voor uw toepassingen.

C#-apps profiteren van het automatische geheugenbeheer van .NET Runtime. C#-apps maken ook gebruik van de uitgebreide runtimebibliotheken die worden geleverd door de .NET SDK. Sommige onderdelen zijn platformonafhankelijk, zoals bestandssysteembibliotheken, gegevensverzamelingen en wiskundige bibliotheken. Andere zijn specifiek voor één workload, zoals de ASP.NET Core-webbibliotheken of de .NETLOAD UI-bibliotheek. Een uitgebreid Open Source-ecosysteem in NuGet vergroot de bibliotheken die deel uitmaken van de runtime. Deze bibliotheken bieden nog meer onderdelen die u kunt gebruiken.

C# bevindt zich in de C-familie van talen. C#-syntaxis is bekend als u C, C++, JavaScript of Java hebt gebruikt. Net als alle talen in de C-familie definiëren puntkomma's (;) het einde van de instructies. C#-id's zijn hoofdlettergevoelig. C# heeft hetzelfde gebruik van accolades en }{ besturingsinstructies zoals if, else en , en switchlusconstructies zoals for, en while. C# heeft ook een foreach instructie voor elk verzamelingstype.

C# is een sterk getypte taal. Elke variabele die u declareert, heeft een type dat bekend is tijdens het compileren. De compiler of bewerkingsprogramma's geven aan of u dat type onjuist gebruikt. U kunt deze fouten oplossen voordat u het programma ooit uitvoert. Fundamentele gegevenstypen zijn ingebouwd in de taal en runtime: waardetypen zoals int, , doublereferentietypen charzoals string, matrices en andere verzamelingen. Terwijl u uw programma's schrijft, maakt u uw eigen typen. Deze typen kunnen typen zijn struct voor waarden of class typen die objectgeoriënteerd gedrag definiëren. U kunt de record wijzigingsfunctie toevoegen aan struct of class typen, zodat de compiler code samenvoegt voor gelijkheidsvergelijkingen. U kunt ook definities maken interface , die een contract definiëren, of een set leden, die een type dat die interface implementeert, moet bieden. U kunt ook algemene typen en methoden definiëren. Generics gebruiken typeparameters om een tijdelijke aanduiding voor een werkelijk type op te geven wanneer ze worden gebruikt.

Tijdens het schrijven van code definieert u functies, ook wel methoden genoemd, als leden en struct class typen. Met deze methoden wordt het gedrag van uw typen gedefinieerd. Methoden kunnen worden overbelast, met verschillende getallen of typen parameters. Methoden kunnen eventueel een waarde retourneren. Naast methoden kunnen C#-typen eigenschappen hebben. Dit zijn gegevenselementen die worden ondersteund door functies die accessors worden genoemd. C#-typen kunnen gebeurtenissen definiëren, waardoor een type abonnees op de hoogte kan stellen van belangrijke acties. C# ondersteunt objectgeoriënteerde technieken zoals overname en polymorfisme voor class typen.

C#-apps maken gebruik van uitzonderingen om fouten te rapporteren en af te handelen. U bent bekend met deze procedure als u C++ of Java hebt gebruikt. Uw code genereert een uitzondering wanneer deze niet kan doen wat is bedoeld. Andere code, ongeacht het aantal niveaus in de aanroepstack, kan eventueel worden hersteld met behulp van een try - catch blok.

Onderscheidende C#-functies

Sommige elementen van C# zijn mogelijk minder bekend. Language Integrated Query (LINQ) biedt een algemene syntaxis op basis van een patroon om een query uit te voeren of een verzameling gegevens te transformeren. LINQ unifieert de syntaxis voor het uitvoeren van query's in-memory verzamelingen, gestructureerde gegevens zoals XML of JSON, databaseopslag en zelfs cloudgegevens-API's. U leert één set syntaxis en u kunt gegevens doorzoeken en bewerken, ongeacht de opslag. Met de volgende query worden alle leerlingen/studenten gevonden waarvan het cijfergemiddelde groter is dan 3,5:

var honorRoll = from student in Students
                where student.GPA > 3.5
                select student;

De voorgaande query werkt voor veel opslagtypen die worden vertegenwoordigd door Students. Dit kan een verzameling objecten, een databasetabel, een blob in de cloud of een XML-structuur zijn. Dezelfde querysyntaxis werkt voor alle opslagtypen.

Met het asynchrone programmeermodel op basis van taken kunt u code schrijven die gelezen wordt alsof deze synchroon wordt uitgevoerd, ook al wordt het asynchroon uitgevoerd. Het maakt gebruik van de async en await trefwoorden om methoden te beschrijven die asynchroon zijn en wanneer een expressie asynchroon evalueert. Het volgende voorbeeld wacht op een asynchrone webaanvraag. Wanneer de asynchrone bewerking is voltooid, retourneert de methode de lengte van het antwoord:

public static async Task<int> GetPageLengthAsync(string endpoint)
{
    var client = new HttpClient();
    var uri = new Uri(endpoint);
    byte[] content = await client.GetByteArrayAsync(uri);
    return content.Length;
}

C# ondersteunt ook een await foreach instructie voor het herhalen van een verzameling die wordt ondersteund door een asynchrone bewerking, zoals een GraphQL-paginerings-API. In het volgende voorbeeld worden gegevens in segmenten gelezen en wordt een iterator geretourneerd die toegang biedt tot elk element wanneer het beschikbaar is:

public static async IAsyncEnumerable<int> ReadSequence()
{
    int index = 0;
    while (index < 100)
    {
        int[] nextChunk = await GetNextChunk(index);
        if (nextChunk.Length == 0)
        {
            yield break;
        }
        foreach (var item in nextChunk)
        {
            yield return item;
        }
        index++;
    }
}

Bellers kunnen de verzameling herhalen met behulp van een await foreach instructie:

await foreach (var number in ReadSequence())
{
    Console.WriteLine(number);
}

C# biedt patroonkoppeling. Met deze expressies kunt u gegevens controleren en beslissingen nemen op basis van de kenmerken ervan. Patroonkoppeling biedt een uitstekende syntaxis voor de controlestroom op basis van gegevens. De volgende code laat zien hoe methoden voor de booleaanse en, of, en xor-bewerkingen kunnen worden uitgedrukt met behulp van syntaxis voor patroonkoppeling:

public static bool Or(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

public static bool And(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => false,
        (false, true) => false,
        (false, false) => false,
    };
public static bool Xor(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => false,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

Patroonkoppelingsexpressies kunnen worden vereenvoudigd met behulp van _ alles voor elke waarde. In het volgende voorbeeld ziet u hoe u de en methode kunt vereenvoudigen:

public static bool ReducedAnd(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (_, _) => false,
    };

Ten slotte kunt u als onderdeel van het .NET-ecosysteem Visual Studio of Visual Studio Code gebruiken met de C# DevKit. Deze hulpprogramma's bieden een uitgebreid begrip van C#, inclusief de code die u schrijft. Ze bieden ook mogelijkheden voor foutopsporing.