C Sharp
Logo języka | |
Pojawienie się |
lipiec 2000 |
---|---|
Paradygmat | |
Implementacje |
C# |
Aktualna wersja stabilna |
12.0[1] (14 listopada 2023; ponad rok temu) |
Twórca | |
Platforma sprzętowa | |
Platforma systemowa |
Microsoft Windows: .NET Framework |
Strona internetowa |
C#[2] (C Sharp; wym. [siːˈʃɑːp]; dosłownie „cis”, „c z krzyżykiem”) – wieloparadygmatowy język programowania zaprojektowany w latach 1998–2001 przez zespół pod kierunkiem Andersa Hejlsberga dla firmy Microsoft.
Program napisany w tym języku kompilowany jest do języka Common Intermediate Language (CIL), specjalnego kodu pośredniego wykonywanego w środowisku uruchomieniowym takim jak .NET Framework, .NET Core, Mono lub DotGNU. Wykonanie skompilowanego programu przez system operacyjny wymaga zainstalowanego środowiska uruchomieniowego[3] lub zawarcia go w dystrybuowanej aplikacji (tzw. aplikacja typu self-contained)[4]. Począwszy od wersji środowiska .NET 7, aplikacje mogą być także kompilowane w wersji natywnej dla wybranej platformy[5].
Nazwa
[edytuj | edytuj kod]Nazwa języka powstała analogicznie jak nazwa C++. Operator ++ w C (w C++ też) oznacza zwiększenie o jeden, więc C++ to więcej niż C. Autorzy C# wykorzystali podobny pomysł, gdzie symbol krzyżyka/kratki przypomina cztery połączone ze sobą operatory +. W muzyce dźwięk C♯ jest wyższy niż dźwięk C, może to sugerować, że język jest rozwinięciem C/C++[6].
Symbol ♯ (krzyżyk) jest niedostępny na większości klawiatur, niektórych czcionkach i przeglądarkach internetowych, dlatego zalecane jest używanie symbolu kratki (#), który bardzo przypomina symbol muzyczny. Czasami tam gdzie ma to uzasadnienie np. w materiałach promocyjnych, Microsoft używa nazwy C♯ zamiast C#[7].
Cechy języka
[edytuj | edytuj kod]Język C# ma wiele cech wspólnych z językami programowania Object Pascal, Delphi, C++ i Java.
- obiektowość z hierarchią o jednym elemencie nadrzędnym: podobnie jak w Javie, kod programu jest zbiorem klas. W C#, podobnie jak w Javie/Object Pascalu, hierarchia dziedziczenia opiera się na istnieniu jednej klasy
Object
(System.Object
), która stanowi element nadrzędny tej hierarchii. W szczególności oznacza to, że również typy proste (int
,double
, itd.) są strukturami z właściwymi sobie metodami, np.int i=1; string s = i.ToString();
- odśmiecanie pamięci: zarządzaniem pamięcią zajmuje się środowisko uruchomieniowe. Oznacza to, że nie ma potrzeby samodzielnego zajmowania się zwalnianiem pamięci po obiektach, które przestają być używane
- właściwości, indeksery: dodatkowe elementy składowe klas
- delegaty, zdarzenia: odpowiedniki i rozwinięcie wskaźników na funkcje z C++
- refleksje i atrybuty klas: w czasie pracy programu istnieje możliwość analizy struktury kodu z poziomu tego kodu. Umożliwia to tworzenie wysoce uniwersalnych mechanizmów operujących na strukturze kodu nieznanej w czasie kompilacji. Mechanizm ten wykorzystywany jest m.in. w bibliotekach ORM, narzędziach do analizy i weryfikacji kodu czy rozszerzeniach AOP. Mechanizm atrybutów został z C# zapożyczony do języka Java w wersji 1.5 (adnotacje), jakkolwiek samo Reflection API istniejące od pierwszego wydania języka stanowiło inspirację dla twórców C#
- typy ogólne (generics – dostępne od wersji .NET 2.0): mechanizm zbliżony swoją ogólnością do szablonów w C++, jednak tu typ ogólny jest przenoszony do modułu binarnego i możliwy jest do wykorzystania bez konieczności posiadania kodu źródłowego
- dynamiczne tworzenie kodu: biblioteki .NET umożliwiają dynamiczne tworzenie kodu w czasie działania programu i włączanie go do kodu aktualnie wykonywanego. Możliwe jest zarówno dynamiczne tworzenie kodu wykonywalnego ze źródeł C# jak i tworzenie dynamicznych modułów w języku pośrednim (CIL).
- bogata biblioteka klas BCL, umożliwiająca rozwijanie aplikacji konsolowych, okienkowych (System.Windows.Forms oraz WPF od .NET Framework 3.0), bazodanowych (ADO.NET), sieciowych (System.Net), w architekturze rozproszonej (WebServices) czy dynamicznych aplikacji internetowych (ASP.NET) oraz dynamiczne treści multimedialne (Silverlight).
- W C#, podobnie jak w C stosuje się dwa rodzaje komentarzy:
//
to komentarz jednoliniowy, czyli wszystkiego, co znajduje się za nim, kompilator nie bierze pod uwagę.- Komentarz wielowierszowy zaczyna się od
/*
a kończy*/
. Kompilator nie bierze pod uwagę tego, co znajduje się pomiędzy.
Jeśli komentarz zaczyna się od ///
lub /**
, to jest to komentarz, w którym umieszcza się dokumentację do kodu.
C# 2.0
[edytuj | edytuj kod]Rozszerzenia do języka C# zostały przedstawione przez Microsoft w roku 2005 wraz z prezentacją .NET Framework 2.0 oraz Visual Studio 2005.
Najważniejsze z rozszerzeń to:
- typy generyczne – typy te rozszerzają język C# o polimorfizm parametryczny.
Kopiec zaimplementowany przy pomocy szablonu klasy:
public class Kopiec<T>
{
private T[] tablica;
// konstruktor
public Kopiec(T[] tablica) {...}
// wstawianie nowego elementu do kopca
public void Wstaw(T elem) {...}
}
- słowo kluczowe
yield
.
- typy częściowe – umożliwiają rozbicie klasy, struktury lub interfejsu do wielu plików źródłowych. Klasa częściowa wymaga użycia słowa kluczowego
partial
.
- metody anonimowe – pozwalają na tworzenie funkcji „w miejscu”. Funkcje takie umożliwiają związanie kodu funkcji bezpośrednio z instancją delegata. Oznacza to, że te funkcje nie mają nazwy i mogą być wywołane jedynie przez wywołanie delegata.
someButton.Click += delegate { MessageBox.Show("Wciśnięto przycisk"); };
- typy Nullable – to typ prosty, który łączy wartości swojego typu podstawowego z dodatkowym oznaczeniem braku wartości (null). Typy te są tworzone przez połączenie nazwy typu prostego ze znakiem ‘?’ np. int?, float?. Głównym zastosowaniem tych typów jest współpraca z bazami danych. Reprezentują one wartości uzyskane z bazy danych, uwzględniając możliwość nie istnienia danej wartości w bazie.
C# 3.0
[edytuj | edytuj kod]- Słowa kluczowe "
select
,from
,where
" pozwalające na dostęp do SQL, XML, kolekcji i innych (Language integrated query (LINQ)) - Proste inicjowanie obiektów:
Klient k = new Klient(); k.Imie="Jan";
staje sięKlient k = new Klient() { Imie="Jan" };
- wyrażenia lambda:
listOfFoo.Where(delegate(Foo x) { return x.size>10;})
staje sięlistOfFoo.Where(x => x.size>10);
- Typy domniemane:
var x = "hello";
oznacza to samo, costring x = "hello";
- Typy anonimowe:
var x = new { Imie = "Jan" }
- Automatycznie generowane właściwości:
public static int Liczba { get; internal set; }
- Rozszerzanie typów – dodawanie nowych metod do istniejących klas bez potrzeby ich dziedziczenia.
C# 3.0 przedstawiono na PDC 2005. Jest obsługiwany przez środowisko Visual Studio 2008, a jego kompilator jest częścią platformy .NET Framework 3.5.
C# 4.0
[edytuj | edytuj kod]- Obsługa języków dynamicznych dzięki słowu kluczowemu
dynamic
. - Obsługa kontra- i kowariancji.
- Opcjonalne słowo kluczowe
ref
dla wywołań metod obiektów COM. - Parametry opcjonalne i argumenty nazwane.
Jest obsługiwany przez środowisko Visual Studio 2010, a jego kompilator jest częścią platformy .NET Framework 4.0.
C# 5.0
[edytuj | edytuj kod]- Słowa kluczowe
await
iasync
ułatwiające programowanie asynchroniczne. - Nowy atrybut
Caller Info
umożliwiający uzyskanie szczegółowych informacji o wywołaniu metod.
C# 6.0
[edytuj | edytuj kod]- Możliwość użycia słów kluczowych async/await w blokach catch/finally
- Nowa dyrektywa preprocesora
nameof
- Null propagation
- Dodano filtry wyjątków w bloku
catch
- Dodaną nowy sposób na formatowanie łańcuchów znaków - String Interpolation
C# 7.0
[edytuj | edytuj kod]- Możliwość tworzenia funkcji lokalnych (definiowanych wewnątrz innych funkcji)
- Value Tuples
public (string name, int age) GetStudentInfo()
{
return (name: "Annie", age: 25);
}
var (name, age) info = GetStudentInfo();
- ref return - zwracanie poprzez referencję (ma głównie wartość wydajnościową, np. przy dużych strukturach).
public class Score
{
private int value = 5;
public ref int Get()
{
return ref this.value;
}
}
- ref locals
- pattern matching - umożliwia sprawdzanie, czy zmienna jest danego typu i, jeśli tak, przypisanie tej wartości do nowej zmiennej typu docelowego. Możliwe jest również dołączanie dodatkowych warunków za pomocą słowa kluczowego
when
public static double ComputeArea_Version4(object shape)
{
switch (shape)
{
case Square s when s.Side == 0:
case Circle c when c.Radius == 0:
case Triangle t when t.Base == 0 || t.Height == 0:
case Rectangle r when r.Length == 0 || r.Height == 0:
return 0;
}
}
C# 7.1
[edytuj | edytuj kod]- async Main
- Uproszczone korzystanie z
default
private static int NewMethodWithArgs(int i = default, object o = default)
{
return default;
}
- Uproszczone korzystanie z Value Tuples
int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // zmienna pair będzie posiadać dwa elementy: pair.count oraz pair.label
C# 8.0
[edytuj | edytuj kod]Jest obsługiwany przez środowisko Visual Studio 2019, a jego kompilator jest częścią platformy .NET Core 3.x[10][11].
- Elementy członkowskie tylko do odczytu
- Domyślne metody interfejsu
- Ulepszenia dopasowania wzorca:
- Przełączanie wyrażeń
- Wzorce właściwości
- Wzorce krotki
- Wzorce pozycyjne
- Używanie deklaracji
- Statyczne funkcje lokalne
- Indeksy i zakresy
var zdanie = new string[]
{
// indeks od początku indeks od końca
"Ala", // 0 ^7
"ma", // 1 ^6
"kota", // 2 ^5
"a", // 3 ^4
"kot", // 4 ^3
"ma", // 5 ^2
"Alę.", // 6 ^1
}; // 7 (lub words.Length) ^0
Console.WriteLine($"Ostatnie słowo w zdaniu to {zdanie[^1]}"); // program wypisze "Alę."
C# 9.0
[edytuj | edytuj kod]Jest obsługiwany przez środowisko Visual Studio 2019, a jego kompilator jest częścią platformy .NET 5.0[12][13].
- Wprowadzono typy rekordów
public record Osoba { public string Imie { get; set; } public string Nazwisko { get; set; } };
public record Osoba(string Imie, string Nazwisko);
- Niemutowalne właściwości w obiektach
public class Osoba { public int Wiek { get; init; } }
- Instrukcje najwyższego poziomu
- Ulepszone dopasowanie do wzorca
- Wydajność i współdziałanie
C# 10.0
[edytuj | edytuj kod]Jest obsługiwany przez środowisko Visual Studio 2022, a jego kompilator jest częścią platformy .NET 6.0[14][15]
- Wprowadzono nową składnię - !! po nazwie parametru w sygnaturze metody sprawi, że zostanie sprawdzona wartość tego parametru i zostanie rzucony wyjątek, jeżeli jest ona nullem.
- Wprowadzono global using, który umożliwia wszystkim plikom projektu dostęp do przestrzeni nazw określonych z tym dopiskiem.
- Wprowadzono deklarację przestrzeni nazw o zakresie pliku.
- Ulepszono wyrażenie lambda.
- Rekordy mogą mieć zapieczętowane ToString.
- Ciągi interpolowane jako stałe.
C# 11.0
[edytuj | edytuj kod]Jest obsługiwany przez środowisko Visual Studio 2022, a jego kompilator jest częścią platformy .NET 7[16][17][18]
- Dodanie atrybutów generycznych
- Możliwość oznaczania właściwości i pól z użyciem modyfikatora required
- Nowe linie w interpolacjach ciągów znaków
- Aliasy dla IntPtr i UIntPtr
- Rozszerzony zakres nameof
C# 12.0
[edytuj | edytuj kod]Jest obsługiwany przez środowisko Visual Studio 2022, a jego kompilator jest częścią platformy .NET 8[19][20]
- Dodanie konstruktorów podstawowych
public class Osoba(string imie) { public string Imie => imie; }
- Wyrażenia kolekcji
int[] numbers = [1, 2, 3, 4]; List<string> strings = [];
- Tablice wbudowane
- Aliasy dla dowolnych typów
- Przechwytywanie kodu
- Atrybut eksperymentalny
Przykładowe programy
[edytuj | edytuj kod]Prosty program napisany w języku C#. Po jego skompilowaniu i uruchomieniu wyświetlony zostanie napis "Podaj swoje imię: ". Po pobraniu imienia od użytkownika, zostanie ono wyświetlone w następnej linii.
using System;
public class PrzykladowaKlasa
{
public static void Main()
{
Console.WriteLine("Podaj swoje imię:");
string imie = Console.ReadLine();
Console.WriteLine($"Twoje imię to: {imie}");
Console.WriteLine("Wciśnij dowolny klawisz by zakończyć program.");
Console.ReadKey();
}
}
Inny program symulujący uniwersalną kostkę do gry, można w nim zobaczyć kilka podstawowych instrukcji języka C# oraz wykorzystanie funkcji instrukcji najwyższego poziomu.
int kostka;
Random liczba = new();
string input = string.Empty;
Console.Clear();
while (true)
{
Console.Write("Iluścienną kostką chcesz grać? ");
try
{
kostka = int.Parse(Console.ReadLine());
}
catch
{
Console.WriteLine("Podano nieprawidłowe dane!");
kostka = 0;
}
if (kostka < 4)
{
Console.WriteLine("Kostka ma minimum 4 ściany.");
}
else break;
}
Console.Clear();
while (!input.Equals("q"))
{
Console.WriteLine($"Wylosowana liczba to: {liczba.Next(kostka) + 1}\tAby zakończyć wciśnij Q + Enter");
input = Console.ReadLine();
}
Przykładowy program który działa jak stoper i aktualizuje się co sekundę:
using System;
using System.Threading;
class Stopwatch
{
static void Main()
{
int seconds = 0;
while (true)
{
Console.Clear(); // Wyczyść konsolę, aby zaktualizować czas na tym samym miejscu
Console.WriteLine("Czas: {0} sekund", seconds);
Thread.Sleep(1000); // Poczekaj 1 sekundę
seconds++; // Zwiększ licznik sekund o 1
}
}
}
Zobacz też
[edytuj | edytuj kod]Inne języki platformy .NET:
Platforma .NET:
Przypisy
[edytuj | edytuj kod]- ↑ Announcing C# 12. docs.microsoft.com, 2023-11-14. [dostęp 2024-04-03]. (ang.).
- ↑ Home - Ecma International [online], ecma-international.org [dostęp 2021-01-17] [zarchiwizowane z adresu 2003-08-03] (ang.).
- ↑ A Tour of C# - C# Guide | Microsoft Docs. docs.microsoft.com, 2021-01-28. [dostęp 2021-08-11]. (ang.).
- ↑ Trim self-contained applications - .NET | Microsoft Docs. docs.microsoft.com, 2020-04-03. [dostęp 2021-08-11]. (ang.).
- ↑ .NET 7 Preview 3 Is All About Native AOT. visualstudiomagazine.com, 2022-04-15. [dostęp 2024-04-06]. (ang.).
- ↑ Naomi Hamilton: The A–Z of Programming Languages: C#. Computerworld, 2008-10-01. [dostęp 2016-10-24]. [zarchiwizowane z tego adresu (2015-04-02)]. (ang.).
- ↑ https://web.archive.org/web/20170622073304/https://www.microsoft.com/presspass/images/gallery/boxshots/web/visual-c-sharp03.jpg
- ↑ An Introduction to New Features in C# 5.0 – Microsoft MVP Award Program Blog [online], blogs.msdn.com [dostęp 2017-11-22] [zarchiwizowane z adresu 2013-04-27] (ang.).
- ↑ What's New in C# - C# Guide | Microsoft Docs [online], msdn.microsoft.com [dostęp 2017-11-22] (ang.).
- ↑ s, Visual Studio 2019 version 16.11 Release Notes [online], docs.microsoft.com [dostęp 2021-09-01] (ang.).
- ↑ BillWagner, Co nowego w języku C# 8.0 — przewodnik po języku C# [online], docs.microsoft.com [dostęp 2021-09-01] (pol.).
- ↑ Welcome to C# 9.0 [online], .NET Blog, 20 maja 2020 [dostęp 2021-08-30] (ang.).
- ↑ C# 9.0 w wersji preview już dostępny [online], bulldogjob.pl [dostęp 2021-08-30] (pol.).
- ↑ BillWagner, Co nowego w języku C# 10 — przewodnik po języku C# [online], docs.microsoft.com [dostęp 2022-04-17] (pol.).
- ↑ Nowości w .NET 6 i C# 10 [online], bulldogjob.pl [dostęp 2022-04-17] (pol.).
- ↑ C# 11 – sprawdź, co nowego! [online], JCommerce | Outsourcing usług IT, BI, EMM, Managed Services, 21 września 2022 [dostęp 2022-12-27] (pol.).
- ↑ C# 11 – przegląd nadchodzących nowości [online], bulldogjob.pl [dostęp 2022-12-27] (pol.).
- ↑ C# Language Design, .NET Platform, 27 grudnia 2022 [dostęp 2022-12-27] .
- ↑ https://bulldogjob.pl/readme/nowosci-w-jezyku-c-12-krok-naprzod-w-programowaniu-obiektowym
- ↑ Co nowego w języku C# 12 — Przewodnik języka C# - C# | Microsoft Learn [online], microsoft.com [dostęp 2024-04-22] (pol.).