Dela 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.

C# finns i C-språkfamiljen. C#-syntax är bekant om du använde C, C++, JavaScript, TypeScript eller Java. Liksom C och C++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.

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. Ett annat programformulär kräver att du deklarerar den innehållande klassen och -metoden för programmets startpunkt. Kompilatorn syntetiserar dessa element när du använder toppnivåinstruktioner.

Det här alternativa formatet är fortfarande giltigt och innehåller många av de grundläggande begreppen i alla C#-program. Många befintliga C#-exempel använder följande motsvarande format:

using System;
using TourOfCsharp;

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

Föregående "Hello, World"-program börjar med ett using-direktiv som refererar till System namnrymd. Namnrymder ä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 Program 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. Klassen som innehåller metoden Main heter vanligtvis Program.

Tips

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, TypeScripteller Pythonkan du läsa våra tips för 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 rikt ekosystem med öppen källkod på NuGet förstärker de bibliotek som ingår i körtiden. De här biblioteken innehåller ännu fler komponenter som du kan använda.

C# är ett strikt typat 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 valfritt 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. Den här metoden är bekant om du använde 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.

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

Även i de föregående exemplen deklareras tupplar , som är lätta datastrukturer. En tuppeln är en ordnad sekvens av värden med fast längd, som kan ha valfria namn och individuella typer. Du omger sekvensen med tecknen ( och ). Deklarationen (left, right) definierar en tuppel med två booleska värden: left och right. Varje växelarm deklarerar ett tuppelvärde, till exempel (true, true). Tupplar ger praktisk syntax för att deklarera ett enda värde med flera värden.

Samlingsuttryck ger en gemensam syntax för att tillhandahålla värden i samlingar. Du skriver värden eller uttryck mellan [ och ] tecken och kompilatorn konverterar uttrycket till den obligatoriska samlingstypen:

int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<string> names = ["Alice", "Bob", "Charlie", "David"];

IEnumerable<int> moreNumbers = [.. numbers, 11, 12, 13];
IEnumerable<string> empty = [];

I föregående exempel visas olika samlingstyper som kan initieras med samlingsuttryck. Ett exempel använder [] tomma samlingsuttrycket för att deklarera en tom samling. Ett annat exempel använder ..spridningselementet för att expandera en samling och lägga till alla dess värden i samlingsuttrycket.

Du kan använda index och intervall uttryck för att hämta ett eller flera element från en indexerbar samling:

string second = names[1]; // 0-based index
string last = names[^1]; // ^1 is the last element
int[] smallNumbers = numbers[0..5]; // 0 to 4

Indexet ^ anger från slutet i stället för från början. Elementet ^0 är precis bortom slutet av samlingen, så ^1 är det sista elementet. .. i ett intervalluttryck anger det område med element som ska inkluderas. Intervallet börjar med det första indexet och innehåller alla element upp till, men inte inklusive, elementet vid det senaste indexet.

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 understötts av en asynkron operation, till exempel ett GraphQL-paginering-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);
}

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.