Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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. Több millió fejlesztővel a C# a legnépszerűbb .NET-nyelv. A C# széles körű támogatást nyújt az ökoszisztémában és az összes .NET-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 .NET-futtatókörnyezetek é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 a 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# ugyanúgy használja a kapcsos zárójeleket, {
és }
az olyan vezérlő utasításokat, mint az if
, else
és switch
a hurkos szerkezetek, például for
az , és while
. A C# bármilyen gyűjteménytípushoz rendelkezik foreach
utasítással.
Helló világ
A "Hello, World" program hagyományosan egy programozási nyelv bevezetésére szolgál. Itt van a C#- ban:
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
A kezdő sor //
egyetlen sor megjegyzése. 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. Ezt az osztályt a standard osztálykódtárak biztosítják, amelyekre alapértelmezés szerint minden C# program automatikusan hivatkozik. 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 egyéb névtereket tartalmaznak– például a System
névtér 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 irányelv miatt a using
program rövidítésként használható Console.WriteLine
a System.Console.WriteLine
. A korábbi példában ez a névtér implicit módon szerepelt.
A Program
"Hello, World" program által deklarált osztálynak egyetlen tagja van, a metódus neve Main
. A Main
metódus deklarálása a static
módosítóval történik. Míg a példánymetódusok a kulcsszó this
használatával hivatkozhatnak egy adott objektumpéldányra, a statikus metódusok egy adott objektumra való hivatkozás nélkül működnek. Konvenció szerint, ha nincsenek legfelső szintű utasítások, a C#-program belépési pontjaként Main
egy statikus metódus neve szolgál. A metódust tartalmazó Main
osztály neve általában Program
.
Tipp.
A cikkben szereplő példák első pillantást engednek a C#-kódra. Egyes minták olyan C# elemeket mutathatnak, amelyeket nem ismerhet. Ha készen áll a C# elsajátítására, kezdje a kezdő oktatóanyagokkal, vagy ismerkedjen meg az egyes szakaszok hivatkozásaival. Ha járt már Java, JavaScript, TypeScript vagy Python nyelven, olvassa el tippjeinket, amelyek segítenek megtalálni a C# gyors elsajátításához szükséges információkat.
Fájlalapú programok
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 létrehozhat fájlalapú programokat, amelyek leegyszerűsí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.cs
fájlban van tárolva, a következő beírással dotnet run hello-world.cs
futtathatja:
#!/usr/local/share/dotnet/dotnet run
Console.WriteLine("Hello, World!");
A program első sora tartalmazza a #!
szekvenciát a unix shell-ekhez. A parancssori felület dotnet
helye különböző disztribúcióktól függően változhat. Bármely unix rendszeren, ha egy C# fájl végrehajtási (+x
) engedélyét állítja be, a parancssorból futtathatja a C# fájlt:
./hello-world.cs
Ezeknek a programoknak a forrásának egyetlen fájlnak kell lennie, de ellenkező esetben az összes C# szintaxis érvényes. Használhat fájlalapú programokat 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 hatékonyan dolgozhat. Az alkalmazásokhoz szükséges speciális technikákat is megismerheti.
A C#-alkalmazások kihasználják a .NET-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 közlik, hogy helytelenül használja-e 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
, char
referenciatípusok, például string
tö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.
Az általánosaktípusparaméterekkel biztosítják a tényleges típus helyőrzőit 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ámú vagy típusú paraméterekkel. 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, függetlenül attól, hogy hány szinttel feljebb van a hívásverem, blokk használatával try
- catch
is helyreállítható.
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 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 minden értéknél fogáské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 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, amelyek gyűjteménykifejezésekkel inicializálhatók. 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]; // 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.
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 Students
ké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. Az aszinkron metódusokat és async
a await
kulcsszavakat használja az aszinkron metódusok leírására, és amikor egy kifejezés aszinkron módon kiértékeli azokat. 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 utasítással 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.