Share via


En rundtur i C#-språket

C#-språket är det mest populära språket för .NET-plattformen, en kostnadsfri, plattformsoberoende öppen källkod utvecklingsmiljö. C#-program kan köras på många olika enheter, från IoT-enheter (Internet of Things) till molnet och överallt däremellan. Du kan skriva appar för telefoner, stationära och bärbara datorer och servrar.

C# är ett plattformsoberoende språk som gör utvecklare produktiva samtidigt som de skriver mycket högpresterande kod. Med miljontals utvecklare är C# det mest populära .NET-språket. C# har brett stöd i ekosystemet och alla .NET-arbetsbelastningar. Baserat på objektorienterade principer innehåller den många funktioner från andra paradigm, inte minst funktionell programmering. Lågnivåfunktioner stöder scenarier med hög effektivitet utan att skriva osäker kod. De flesta .NET-körnings- och biblioteken är skrivna i C#, och framsteg i C# gynnar ofta alla .NET-utvecklare.

Hello World

Programmet "Hello, World" används traditionellt för att introducera ett programmeringsspråk. Här är den i C#:

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

Raden som börjar med // är en enskild radkommentar. C#-kommentarer med en rad börjar med // och fortsätter till slutet av den aktuella raden. C# har också stöd för flerradskommentarer. Flerradskommentarer börjar med /* och slutar med */. Metoden WriteLine för Console klassen, som finns i System namnområdet, genererar programmets utdata. Den här klassen tillhandahålls av standardklassbiblioteken, som som standard automatiskt refereras till i varje C#-program.

Föregående exempel visar en form av ett "Hello, World"-program med hjälp av toppnivåinstruktioner. Tidigare versioner av C# krävde att du definierade programmets startpunkt i en metod. Det här formatet är fortfarande giltigt och du ser det i många befintliga C#-exempel. Du bör också känna till det här formuläret, som du ser i följande exempel:

using System;

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

Den här versionen visar de byggstenar som du använder i dina program. Programmet "Hello, World" börjar med ett using direktiv som refererar till System namnområdet. Namnområden är ett hierarkiskt sätt att organisera C#-program och -bibliotek. Namnområden innehåller typer och andra namnområden, till exempel System innehåller namnområdet många typer, till exempel klassen Console som refereras i programmet och många andra namnområden, till exempel IO och Collections. Ett using direktiv som refererar till ett givet namnområde möjliggör okvalificerad användning av de typer som är medlemmar i det namnområdet. På grund av using direktivet kan programmet använda Console.WriteLine som förkortning för System.Console.WriteLine. I det tidigare exemplet inkluderades det namnområdet implicit .

Klassen Hello som deklareras av programmet "Hello, World" har en enda medlem, metoden med namnet Main. Metoden Main deklareras med static modifieraren. Instansmetoder kan referera till en viss omslutande objektinstans med nyckelordet this, men statiska metoder fungerar utan referens till ett visst objekt. Enligt konventionen fungerar en statisk metod med namnet Main som startpunkt för ett C#-program när det inte finns några toppnivåinstruktioner.

Båda startpunktsformulären genererar motsvarande kod. När du använder toppnivåinstruktioner syntetiserar kompilatorn den innehållande klassen och metoden för programmets startpunkt.

Dricks

Exemplen i den här artikeln ger dig en första titt på C#-kod. Vissa exempel kan visa element i C# som du inte är bekant med. När du är redo att lära dig C# börjar du med våra självstudier för nybörjare eller går igenom länkarna i varje avsnitt. Om du har erfarenhet av Java, JavaScript, TypeScript eller Python kan du läsa våra tips som hjälper dig att hitta den information du behöver för att snabbt lära dig C#.

Välbekanta C#-funktioner

C# kan användas för nybörjare men erbjuder avancerade funktioner för erfarna utvecklare som skriver specialiserade program. Du kan vara produktiv snabbt. Du kan lära dig mer specialiserade tekniker när du behöver dem för dina program.

C#-appar drar nytta av .NET Runtimes automatiska minneshantering. C#-appar använder också de omfattande körningsbibliotek som tillhandahålls av .NET SDK. Vissa komponenter är plattformsoberoende, till exempel filsystembibliotek, datasamlingar och matematiska bibliotek. Andra är specifika för en enskild arbetsbelastning, till exempel ASP.NET Core-webbbibliotek eller .NET MAUI-användargränssnittsbiblioteket. Ett omfattande ekosystem med öppen källkod på NuGet utökar de bibliotek som ingår i körningen. De här biblioteken innehåller ännu fler komponenter som du kan använda.

C# finns i C-språkfamiljen. C#-syntaxen är bekant om du har använt C, C++, JavaScript eller Java. Liksom alla språk i C-familjen definierar semikolon (;) slutet av -instruktioner. C#-identifierare är skiftlägeskänsliga. C# har samma användning av klammerparenteser och , kontrollinstruktioner { som if, else och switch, och loopkonstruktioner som for, och while.} C# har också en foreach instruktion för alla samlingstyper.

C# är ett starkt skrivet språk. Varje variabel som du deklarerar har en typ som är känd vid kompileringstiden. Kompilatorn eller redigeringsverktygen anger om du använder den typen felaktigt. Du kan åtgärda dessa fel innan du kör programmet. Grundläggande datatyper är inbyggda i språket och körningen: värdetyper som int, double, char, referenstyper som string, matriser och andra samlingar. När du skriver dina program skapar du dina egna typer. Dessa typer kan vara struct typer för värden eller class typer som definierar objektorienterat beteende. Du kan lägga till record modifieraren i antingen struct eller class typer så att kompilatorn syntetiserar kod för likhetsjämförelser. Du kan också skapa interface definitioner, som definierar ett kontrakt eller en uppsättning medlemmar, som en typ som implementerar gränssnittet måste tillhandahålla. Du kan också definiera allmänna typer och metoder. Generika använder typparametrar för att tillhandahålla en platshållare för en faktisk typ när de används.

När du skriver kod definierar du funktioner, även kallade metoder, som medlemmar i struct och class typer. Dessa metoder definierar beteendet för dina typer. Metoder kan överbelastas med olika antal eller typer av parametrar. Metoder kan också returnera ett värde. Förutom metoder kan C#-typer ha egenskaper, som är dataelement som backas upp av funktioner som kallas accessorer. C#-typer kan definiera händelser som gör att en typ kan meddela prenumeranter om viktiga åtgärder. C# stöder objektorienterade tekniker som arv och polymorfism för class typer.

C#-appar använder undantag för att rapportera och hantera fel. Du kommer att känna till den här metoden om du har använt C++ eller Java. Koden utlöser ett undantag när den inte kan göra det som var avsett. Annan kod, oavsett hur många nivåer upp anropsstacken, kan eventuellt återställas med hjälp av ett try - catch block.

Distinkta C#-funktioner

Vissa element i C# kanske är mindre bekanta. Språkintegrerad fråga (LINQ) innehåller en vanlig mönsterbaserad syntax för att fråga efter eller transformera en samling data. LINQ förenar syntaxen för att köra frågor mot minnesinterna samlingar, strukturerade data som XML eller JSON, databaslagring och till och med molnbaserade data-API:er. Du lär dig en uppsättning syntax och du kan söka efter och manipulera data oavsett lagring. Följande fråga hittar alla elever vars genomsnitt för betygspoäng är större än 3,5:

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

Föregående fråga fungerar för många lagringstyper som representeras av Students. Det kan vara en samling objekt, en databastabell, en molnlagringsblob eller en XML-struktur. Samma frågesyntax fungerar för alla lagringstyper.

Med den aktivitetsbaserade asynkrona programmeringsmodellen kan du skriva kod som ser ut som om den körs synkront, även om den körs asynkront. Den använder nyckelorden async och await för att beskriva metoder som är asynkrona och när ett uttryck utvärderas asynkront. Följande exempel väntar på en asynkron webbbegäran. När den asynkrona åtgärden är klar returnerar metoden längden på svaret:

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# stöder också en await foreach instruktion för att iterera en samling som backas upp av en asynkron åtgärd, till exempel ett GraphQL-växlings-API. Följande exempel läser data i segment och returnerar en iterator som ger åtkomst till varje element när det är tillgängligt:

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++;
    }
}

Anropare kan iterera samlingen med hjälp av en await foreach instruktion:

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

C# ger mönstermatchning. Med dessa uttryck kan du granska data och fatta beslut baserat på dess egenskaper. Mönstermatchning ger en bra syntax för kontrollflöde baserat på data. Följande kod visar hur metoder för booleska och, eller, och xor-åtgärder kan uttryckas med hjälp av mönstermatchningssyntax:

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,
    };

Mönstermatchningsuttryck kan förenklas med som _ en catch all för valfritt värde. I följande exempel visas hur du kan förenkla metoden och :

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

Som en del av .NET-ekosystemet kan du slutligen använda Visual Studio eller Visual Studio Code med C# DevKit. De här verktygen ger omfattande förståelse för C#, inklusive koden du skriver. De tillhandahåller även felsökningsfunktioner.