Przewodnik po języku C#
Język C# jest najpopularniejszym językiem dla platformy .NET, bezpłatnego, międzyplatformowego środowiska deweloperskiego typu open source. Programy języka C# mogą być uruchamiane na wielu różnych urządzeniach, od urządzeń Internetu rzeczy (IoT) do chmury i wszędzie między nimi. Możesz pisać aplikacje dla telefonów, komputerów stacjonarnych i laptopów oraz serwerów.
C# to wieloplatformowy język ogólnego przeznaczenia, który sprawia, że deweloperzy są wydajni podczas pisania wysoce wydajnego kodu. W przypadku milionów deweloperów język C# jest najpopularniejszym językiem platformy .NET. Język C# ma szeroką obsługę ekosystemu i wszystkich obciążeń platformy .NET. W oparciu o zasady obiektowe zawiera wiele cech z innych paradygmatów, a nie tylko programowania funkcjonalnego. Funkcje niskiego poziomu obsługują scenariusze o wysokiej wydajności bez pisania niebezpiecznego kodu. Większość środowiska uruchomieniowego i bibliotek platformy .NET jest napisana w języku C#, a postęp w języku C# często przynosi korzyści wszystkim deweloperom platformy .NET.
Witaj świecie
Program "Hello, World" jest tradycyjnie używany do wprowadzenia języka programowania. W tym miejscu znajduje się on w języku C#:
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
Wiersz rozpoczynający się od //
jest pojedynczym komentarzem wiersza. Komentarze jednowierszowe języka C# zaczynają się od //
i kontynuują końcu bieżącego wiersza. Język C# obsługuje również komentarze wielowierszowe. Komentarze wielowierszowe zaczynają się od i kończą się /*
ciągiem */
. WriteLine
Metoda Console
klasy, która znajduje się w System
przestrzeni nazw, generuje dane wyjściowe programu. Ta klasa jest dostarczana przez standardowe biblioteki klas, do których domyślnie są automatycznie odwoływały się w każdym programie języka C#.
W poprzednim przykładzie pokazano jedną formę programu "Hello, World" przy użyciu instrukcji najwyższego poziomu. Wcześniejsze wersje języka C# wymagały zdefiniowania punktu wejścia programu w metodzie. Ten format jest nadal prawidłowy i zobaczysz go w wielu istniejących przykładach języka C#. Należy również zapoznać się z tym formularzem, jak pokazano w poniższym przykładzie:
using System;
class Hello
{
static void Main()
{
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
}
}
W tej wersji przedstawiono bloki konstrukcyjne używane w programach. Program "Hello, World" rozpoczyna się od dyrektywy odwołującej się using
do System
przestrzeni nazw. Przestrzenie nazw zapewniają hierarchiczne metody organizowania programów i bibliotek języka C#. Przestrzenie nazw zawierają typy i inne przestrzenie nazw — na przykład System
przestrzeń nazw zawiera wiele typów, takich jak Console
klasa, do których odwołuje się program, oraz wiele innych przestrzeni nazw, takich jak IO
i Collections
. Dyrektywa odwołująca using
się do danej przestrzeni nazw umożliwia niekwalifikowane użycie typów będących członkami tej przestrzeni nazw. Ze względu na dyrektywę using
program może użyć Console.WriteLine
jako skrótu dla .System.Console.WriteLine
We wcześniejszym przykładzie ta przestrzeń nazw została niejawnie dołączona.
Klasa Hello
zadeklarowana przez program "Hello, World" ma jeden element członkowski, metodę o nazwie Main
. Metoda Main
jest zadeklarowana za pomocą static
modyfikatora. Chociaż metody wystąpień mogą odwoływać się do określonego otaczającego wystąpienia obiektu przy użyciu słowa kluczowego this
, metody statyczne działają bez odwołania do określonego obiektu. Zgodnie z konwencją, gdy nie ma instrukcji najwyższego poziomu, metoda statyczna o nazwie Main
służy jako punkt wejścia programu C#.
Oba formularze punktu wejścia tworzą równoważny kod. W przypadku korzystania z instrukcji najwyższego poziomu kompilator syntetyzuje zawierającą klasę i metodę punktu wejścia programu.
Napiwek
Przykłady w tym artykule umożliwiają pierwsze przyjrzenie się kodowi języka C#. Niektóre przykłady mogą pokazywać elementy języka C#, których nie znasz. Gdy wszystko będzie gotowe do nauki języka C#, zacznij od naszych samouczków dla początkujących lub zapoznaj się z linkami w każdej sekcji. Jeśli masz doświadczenie w językach Java, JavaScript, TypeScript lub Python, przeczytaj nasze porady, aby ułatwić znajdowanie informacji potrzebnych do szybkiego uczenia się języka C#.
Znane funkcje języka C#
Język C# jest przystępny dla początkujących, ale oferuje zaawansowane funkcje dla doświadczonych deweloperów piszących wyspecjalizowane aplikacje. Możesz szybko pracować wydajnie. Możesz dowiedzieć się więcej wyspecjalizowanych technik, ponieważ są one potrzebne dla aplikacji.
Aplikacje języka C# korzystają z automatycznego zarządzania pamięcią środowiska uruchomieniowego platformy .NET. Aplikacje języka C# używają również rozbudowanych bibliotek środowiska uruchomieniowego udostępnianych przez zestaw .NET SDK. Niektóre składniki są niezależne od platformy, takie jak biblioteki systemu plików, kolekcje danych i biblioteki matematyczne. Inne są specyficzne dla pojedynczego obciążenia, takiego jak biblioteki internetowe platformy ASP.NET Core lub biblioteka interfejsu użytkownika maui platformy .NET. Rozbudowany ekosystem open source w systemie NuGet rozszerza biblioteki będące częścią środowiska uruchomieniowego. Te biblioteki udostępniają jeszcze więcej składników, których można użyć.
Język C# znajduje się w rodzinie języków C. Składnia języka C# jest znana, jeśli używasz języków C, C++, JavaScript lub Java. Podobnie jak wszystkie języki w rodzinie C, średniki (;
) definiują koniec instrukcji. W identyfikatorach języka C# uwzględniana jest wielkość liter. Język C# ma takie samo użycie nawiasów klamrowych i , instrukcji kontrolek, {
takich jak , else
i switch
, oraz konstrukcje pętli, takie jak if
for
, i while
.}
Język C# zawiera również instrukcję foreach
dla dowolnego typu kolekcji.
C# to silnie typizowane języki. Każda zadeklarowana zmienna ma typ znany w czasie kompilacji. Kompilator lub narzędzia do edycji informują, czy używasz tego typu niepoprawnie. Te błędy można naprawić, zanim kiedykolwiek uruchomisz program. Podstawowe typy danych są wbudowane w język i środowisko uruchomieniowe: typy wartości, takie jak , double
, char
, typy referencyjne, takie jak int
string
, tablice i inne kolekcje. Podczas pisania programów tworzysz własne typy. Mogą to być struct
typy wartości lub class
typy definiujące zachowanie obiektowe. Modyfikator można dodać record
do typów struct
lub class
, aby kompilator syntetyzuje kod na potrzeby porównań równości. Można również utworzyć interface
definicje, które definiują kontrakt lub zestaw elementów członkowskich, które muszą zawierać typ implementujący ten interfejs. Można również zdefiniować typy ogólne i metody. Typy ogólne używają parametrów typu, aby podać symbol zastępczy rzeczywistego typu, gdy jest używany.
Podczas pisania kodu definiujesz funkcje, nazywane również metodami jako elementy członkowskie struct
i class
typy. Te metody definiują zachowanie typów. Metody mogą być przeciążone, z różnymi liczbą lub typami parametrów. Metody mogą opcjonalnie zwracać wartość. Oprócz metod typy języka C# mogą mieć właściwości, które są elementami danych wspieranymi przez funkcje nazywane metodami dostępu. Typy języka C# mogą definiować zdarzenia, które umożliwiają typowi powiadamianie subskrybentów o ważnych akcjach. Język C# obsługuje techniki obiektowe, takie jak dziedziczenie i polimorfizm dla class
typów.
Aplikacje języka C# używają wyjątków do raportowania i obsługi błędów. Zapoznasz się z tą praktyką, jeśli używasz języka C++ lub Java. Kod zgłasza wyjątek, gdy nie może wykonać zamierzonego działania. Inny kod, niezależnie od liczby poziomów w górę stosu wywołań, można opcjonalnie odzyskać przy użyciu try
- catch
bloku.
Charakterystyczne funkcje języka C#
Niektóre elementy języka C# mogą być mniej znane. Zapytanie zintegrowane z językiem (LINQ) udostępnia typową składnię opartą na wzorcu, która umożliwia wykonywanie zapytań lub przekształcanie dowolnej kolekcji danych. LINQ łączy składnię wykonywania zapytań dotyczących kolekcji w pamięci, danych strukturalnych, takich jak XML lub JSON, magazyn bazy danych, a nawet interfejsy API danych oparte na chmurze. Poznasz jeden zestaw składni i możesz wyszukiwać i manipulować danymi niezależnie od jego magazynu. Następujące zapytanie znajduje wszystkich uczniów, których średnia punktu oceny jest większa niż 3,5:
var honorRoll = from student in Students
where student.GPA > 3.5
select student;
Powyższe zapytanie działa w przypadku wielu typów magazynu reprezentowanych przez Students
element . Może to być kolekcja obiektów, tabeli bazy danych, obiektu blob magazynu w chmurze lub struktury XML. Ta sama składnia zapytania działa dla wszystkich typów magazynu.
Model programowania asynchronicznego oparty na zadaniu umożliwia pisanie kodu, który odczytuje się tak, jakby był uruchamiany synchronicznie, mimo że jest uruchamiany asynchronicznie. Używa async
słów kluczowych i await
do opisywania metod, które są asynchroniczne, a gdy wyrażenie ocenia asynchronicznie. Poniższy przykład oczekuje na asynchroniczne żądanie internetowe. Po zakończeniu operacji asynchronicznej metoda zwraca długość odpowiedzi:
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;
}
Język C# obsługuje również instrukcję await foreach
iteracji kolekcji wspieranej przez operację asynchroniczną, na przykład interfejs API stronicowania GraphQL. Poniższy przykład odczytuje dane we fragmentach, zwracając iterator, który zapewnia dostęp do każdego elementu, gdy jest dostępny:
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++;
}
}
Osoby wywołujące mogą iterować kolekcję przy użyciu await foreach
instrukcji :
await foreach (var number in ReadSequence())
{
Console.WriteLine(number);
}
Język C# zapewnia dopasowywanie wzorców. Te wyrażenia umożliwiają inspekcję danych i podejmowanie decyzji na podstawie ich cech. Dopasowywanie wzorca zapewnia doskonałą składnię przepływu sterowania na podstawie danych. Poniższy kod pokazuje, w jaki sposób metody operacji logicznych i lub i xor mogą być wyrażane przy użyciu składni dopasowania wzorca:
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,
};
Wyrażenia dopasowywania wzorców można uprościć za pomocą funkcji _
catch wszystkich dla dowolnej wartości. W poniższym przykładzie pokazano, jak można uprościć metodę i :
public static bool ReducedAnd(bool left, bool right) =>
(left, right) switch
{
(true, true) => true,
(_, _) => false,
};
Na koniec w ramach ekosystemu platformy .NET możesz używać programu Visual Studio lub Visual Studio Code z zestawem deweloperskim języka C#. Te narzędzia zapewniają bogatą wiedzę na temat języka C#, w tym pisanego kodu. Zapewniają one również możliwości debugowania.