A C# nyelv bemutatása

Ez a cikk magas szintű áttekintést nyújt a C# nyelvről. Akár az első programját írja, akár tapasztalt fejlesztőként ismerkedik a C#-tal, itt megtalálja a legfontosabb fogalmakat és funkciókat.

Tipp.

Új a programozásban? Olvassa át a cikket a lényeg megértése érdekében, majd kezdje el a kezdő oktatóanyagokat, hogy gyakorlati tapasztalatokat szerezzen a kódírásban.

Java-, JavaScript- vagy Python-alapú? A cikk mellett elolvashatja a Java-, JavaScript- vagy Python-fejlesztőknek szóló tippeket.

Tapasztalt fejlesztő, aki most ismerkedik a C#-tal? Ez a cikk azt ismerteti, hogy mi teszi megkülönböztethetővé a C#-t. Nézze meg, hogy mit építhet C#-tal, hogy megtalálja a céljaihoz illő feladatot.

A C# nyelv a .NET platform legnépszerűbb nyelve, egy ingyenes, platformfüggetlen, nyílt forráskód fejlesztési környezet. A C#-programok számos különböző eszközön futtathatók, az IoT-eszközöktől kezdve a felhőig és mindenhol a kettő között. Alkalmazásokat írhat telefonhoz, asztali számítógéphez, laptophoz és kiszolgálóhoz. Az alkalmazástípusok áttekintéséhez tekintse meg a C# használatával készíthető buildeket .

A C# egy platformfüggetlen általános célú nyelv, amely hatékonyabbá teszi a fejlesztőket, miközben nagy teljesítményű kódot írnak. A C# széles körű támogatást nyújt az ökoszisztémában és számos számítási feladatban. Az objektumorientált alapelveken alapuló, más paradigmák számos funkcióját tartalmazza, nem utolsósorban a funkcionális programozást. Az alacsony szintű funkciók nem biztonságos kód írása nélkül támogatják a nagy hatékonyságú forgatókönyveket. A futtatókörnyezet és a kódtárak többsége C#-ban van megírva, és a C# fejlesztései gyakran minden .NET-fejlesztő számára hasznosak.

A C# a C nyelvcsaládban található. A C#-szintaxis ismerős lesz, ha C, C++, JavaScript, TypeScript vagy Java nyelvet használta. A C és a C++ függvényhez hasonlóan pontosvesszők (;) határozzák meg az utasítások végét. A C#-azonosítók megkülönböztetik a kis- és nagybetűket. A C# ugyanolyan módon használja a kapcsos zárójeleket, mint a vezérlő utasításokat, például a {, } és if, valamint a hurkolási szerkezeteket, mint a else és switch. A C# bármilyen gyűjteménytípushoz rendelkezik foreach utasítással.

Helló világ

A "Hello, World" program hagyományosan bevezet egy programozási nyelvet. A program a C#-ban található:

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

A // kezdetű sor egy soros megjegyzés. A C# egysoros megjegyzései az aktuális sor végével // kezdődnek és folytatódnak. A C# támogatja a többsoros megjegyzéseket is. A többsoros megjegyzések a kezdő és a záró szöveggel kezdődnek /**/. A WriteLine névtérben található Console osztály metódusa System a program kimenetét hozza létre. A standard osztálykódtárak biztosítják ezt az osztályt, és minden C#-program alapértelmezés szerint automatikusan hivatkozik ezekre a kódtárakra. Egy másik programűrlapon deklarálnia kell a program belépési pontjának tartalmazó osztályát és metódusát. A fordító, amikor legfelső szintű utasításokat használunk, szintetizálja ezeket az elemeket.

Ez az alternatív formátum továbbra is érvényes, és az összes C#-program alapfogalmait tartalmazza. Számos meglévő C#-minta a következő formátumot használja:

using System;
namespace TourOfCsharp;

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

Az előző "Hello, World" program a using névtérre hivatkozó System irányelvvel kezdődik. A névterek hierarchikus módon szervezik a C#-programokat és -kódtárakat. A névterek típusokat és más névtereket tartalmaznak. A névtér például System számos típust tartalmaz, például a Console programban hivatkozott osztályt és sok más névteret, például IO és Collections. Egy using adott névtérre hivatkozó irányelv lehetővé teszi az adott névtér tagjai által használt típusok korlátlan használatát. Az using irányelv miatt a program rövidítésként használhatja a Console.WriteLine a System.Console.WriteLine helyett. A korábbi példában ez a névtér implicit módon szerepelt.

Megjegyzés:

Az előző program egyetlen taggal deklarálja az Program osztályt: a metódus neve Main. Sok meglévő C#-minta és oktatóanyag használja ezt a formátumot. Konvenció szerint, ha nincsenek legfelső szintű utasítások, a C# program Main egy statikus metódus szolgál. Mindkét formátum ugyanarra a kódra fordít. Nem kell ezt a formátumot használnia – a fájlalapú alkalmazások és a legfelső szintű utasítások egyszerűbben használhatók az első lépésekhez.

Fájlalapú alkalmazások

A C# egy lefordított nyelv. A legtöbb C#-programban a dotnet build parancs használatával lefordíthat egy forrásfájlcsoportot bináris csomagba. Ezután a dotnet run parancs használatával futtathatja a programot. (Egyszerűsítheti ezt a folyamatot, mert dotnet run szükség esetén a program futtatása előtt lefordítja a programot.) Ezek az eszközök a konfigurációs beállítások és a parancssori kapcsolók gazdag nyelvét támogatják. A dotnet .NET SDK-ban található parancssori felület (CLI) számos eszközt biztosít a C#-fájlok létrehozásához és módosításához.

A C# 14-től és a .NET 10-től kezdve fájlalapú alkalmazásokat hozhat létre, amelyek megkönnyítik a C#-programok létrehozását és futtatását. A parancs használatával dotnet run egyetlen *.cs fájlban található programot futtathat. Ha például a következő kód egy nevesített hello-world.csfájlban van tárolva, a következő beírással dotnet run hello-world.csfuttathatja:

#!/usr/bin/env dotnet

Console.WriteLine("Hello, World!");

A program első sora tartalmazza a #! karakterláncot (shebang) a Unix operációs rendszerekhez. Ez lehetővé teszi a fájl közvetlen végrehajtását a nevével, amikor a végrehajtási (+x) engedély be van állítva a fájlon. A C#-fájlt például közvetlenül a parancssorból futtathatja:

./hello-world.cs

Ezeknek a programoknak a forrásának egyetlen fájlnak kell lennie, de ellenkező esetben az összes C# szintaxis érvényes. Fájlalapú alkalmazásokat használhat kis parancssori segédprogramokhoz, prototípusokhoz vagy más kísérletekhez.

Ismerős C# funkciók

A C# kezdők számára elérhető, de speciális alkalmazásokat író tapasztalt fejlesztőknek nyújt speciális funkciókat. Gyorsan produktív lehet. Az alkalmazásokhoz szükséges speciális technikákat is megismerheti.

A C#-alkalmazások kihasználják a futtatókörnyezet automatikus memóriakezelését. A C#-alkalmazások a .NET SDK által biztosított széles körű futtatókörnyezeti kódtárakat is használják. Egyes összetevők platformfüggetlenek, például fájlrendszertárak, adatgyűjtemények és matematikai kódtárak. Mások egyetlen számítási feladatra vonatkoznak, például a ASP.NET Core webes kódtárakra vagy a .NET MAUI felhasználói felületi kódtárra. A NuGet gazdag nyílt forráskódú ökoszisztémája kibővíti a futtatókörnyezet részét képező kódtárakat. Ezek a kódtárak még több használható összetevőt biztosítanak.

A C# egy erősen gépelt nyelv. Minden deklarált változónak van egy fordítási időpontban ismert típusa. A fordító vagy a szerkesztőeszközök megmondják, ha helytelenül használja ezt a típust. Ezeket a hibákat még a program futtatása előtt kijavíthatja. Az alapvető adattípusok a nyelvbe és a futtatókörnyezetbe vannak beépítve: értéktípusok, például int, double, charreferenciatípusok, például stringtömbök és egyéb gyűjtemények. A programok írásakor saját típusok hozhatók létre. Ezek a típusok lehetnek struct értéktípusok, vagy class objektumorientált viselkedést meghatározó típusok. Hozzáadhatja a record módosítót bármelyikhez struct vagy class típushoz, hogy a fordító szintetizálja a kódot az egyenlőségi összehasonlításokhoz. Olyan definíciókat is létrehozhat interface , amelyek meghatároznak egy szerződést vagy egy tagcsoportot, amelyet az interfészt megvalósító típusnak meg kell adnia. Általános típusokat és metódusokat is definiálhat. A generikusoktípusparamétereket használnak, hogy helyőrzőt biztosítsanak a tényleges típus számára használat esetén.

Kód írásakor függvényeket, más néven metódusokat határoz meg tagokként struct és class típusokként. Ezek a módszerek határozzák meg a típusok viselkedését. A metódusok túlterhelhetők különböző számokkal vagy paramétertípusokkal. A metódusok opcionálisan visszaadhatnak egy értéket. A metódusok mellett a C#-típusok tulajdonságokat is tartalmazhatnak, amelyek a függvények, úgynevezett tartozékok által támogatott adatelemek. A C#-típusok meghatározhatnak eseményeket, amelyek lehetővé teszik, hogy egy típus értesítse az előfizetőket a fontos műveletekről. A C# támogatja az objektumorientált technikákat, például az öröklést és a polimorfizmust a típusok esetében class .

A C#-alkalmazások kivételeket használnak a hibák jelentésére és kezelésére. Ez a gyakorlat akkor ismert, ha C++ vagy Java verziót használt. A kód kivételt jelez, ha nem tudja megtenni a kívánt célt. Más kód választhatóan helyreállítható egy try - catch blokk használatával, függetlenül attól, hogy a hívásveremben hány szinttel feljebb van.

Tipp.

A típusokkal, módszerekkel és kivételekkel kapcsolatos további információkért tekintse meg a C# alapjait ismertető szakaszt . Részletesen ismerteti a típusrendszert, az objektumorientált programozást és a kivételkezelést .

Megkülönböztető C# funkciók

Előfordulhat, hogy a C# egyes elemei kevésbé ismerősek.

A C# mintaegyezést biztosít. Ezek a kifejezések lehetővé teszik az adatok vizsgálatát és azok jellemzői alapján történő döntéshozatalt. A mintaegyeztetés nagyszerű szintaxist biztosít az adatokon alapuló vezérlési folyamatokhoz. Az alábbi kód bemutatja, hogyan fejezhetők ki a logikai és, vagy, és xor műveletek metódusai a mintaegyező szintaxis használatával.

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

A mintaegyeztetési kifejezések egyszerűsödhetnek, ha bármilyen értékhez catchallként használják _ . Az alábbi példa bemutatja, hogyan egyszerűsítheti le a módszert:

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

Az előző példák emellett deklarálják a tuplákat, amelyek egyszerű adatstruktúrák. A tuple az értékek rendezett, rögzített hosszúságú sorozata opcionális névvel és egyéni típusokkal. A sorozatot a ( és ) karakterek közé helyezi. A deklaráció (left, right) két logikai értékkel definiál egy párt: left és right. Minden kapcsolókar egy tupel értéket deklarál, például (true, true). A tuples kényelmes szintaxist biztosít egyetlen érték deklarálásához bármilyen típusú több értékkel.

A gyűjteménykifejezések gyakori szintaxist biztosítanak a gyűjteményértékek megadásához. Értékeket vagy kifejezéseket ír a [ és ] karakterek közé, és a fordító azt a szükséges gyűjteménytípusra alakítja.

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 = [];

Az előző példában különböző gyűjteménytípusok láthatók, amelyeket a gyűjteménykifejezések használatával inicializálhat. Egy példa az [] üres gyűjtemény kifejezéssel deklarál egy üres gyűjteményt. Egy másik példa a .. használja egy gyűjtemény kibontására, hogy az összes értékét hozzáadja a gyűjteménykifejezéshez.

Index- és tartománykifejezésekkel lekérhet egy vagy több elemet egy indexelhető gyűjteményből:

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

Az ^ index az végétől jelzi, nem az elejétől. Az ^0 elem a gyűjtemény végén található, így ^1 az utolsó elem is. A .. tartományban lévő kifejezés a belefoglalandó elemek tartományát jelöli. A tartomány az első indexkel kezdődik, és az összes elemet tartalmazza az utolsó indexben lévő elemig, de nem tartalmazza azt.

Az indexekkel és tartománykifejezésekkel kapcsolatos további információkért tekintse meg az Indexek és tartományok felfedezése című cikket.

A nyelvvel integrált lekérdezés (LINQ) egy gyakori, mintaalapú szintaxist biztosít az adatgyűjtemények lekérdezéséhez vagy átalakításához. A LINQ egyesíti a memóriabeli gyűjtemények, strukturált adatok, például XML vagy JSON, adatbázis-tároló és akár felhőalapú adat API-k lekérdezésének szintaxisát. Megtanulhat egy szintaxiskészletet, és tárterülettől függetlenül kereshet és kezelhet adatokat. Az alábbi lekérdezés az összes tanulót megkeresi, akiknek az osztályzati átlaga nagyobb, mint 3,5:

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

Az előző lekérdezés számos, az általuk Studentsképviselt tárolási típus esetében működik. Ez lehet objektumgyűjtemény, adatbázistábla, felhőalapú tárolóblob vagy XML-struktúra. Ugyanez a lekérdezésszintaxis minden tártípus esetében működik.

A feladatalapú aszinkron programozási modell lehetővé teszi olyan kód írását, amely szinkron módon fut, annak ellenére, hogy aszinkron módon fut. async és await kulcsszavakat használja az aszinkron metódusok leírására, és amikor egy kifejezés aszinkron módon történik. Az alábbi minta egy aszinkron webes kérésre vár. Az aszinkron művelet befejeződésekor a metódus a válasz hosszát adja vissza:

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

A C# támogatja azt az utasítást await foreach is, amely egy aszinkron művelettel támogatott gyűjteményt iterál, például egy GraphQL lapozó API-t. Az alábbi minta adattömbökben olvassa be az adatokat, és visszaad egy iterátort, amely hozzáférést biztosít az egyes elemekhez, ha elérhetők:

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

A hívók egy iterációs utasítás használatával iterálhatják a gyűjteményt: await foreach

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

Végül a .NET-ökoszisztéma részeként használhatja a Visual Studiót vagy a Visual Studio Code-ot a C# DevKittel. Ezek az eszközök részletes ismereteket nyújtanak a C#-ról, beleértve az ön által írt kódot is. Hibakeresési képességeket is biztosítanak.

Tipp.

A mintaegyeztetéssel, a LINQ-tal és az aszinkron programozással kapcsolatos további információkért tekintse meg a funkcionális technikákat, a LINQ áttekintését és az aszinkron programozási szakaszokat.

Következő lépések

Ez a cikk röviden bemutatja a C# nyelvét. A következő lépés a felhasználói élménytől függően: