Wprowadzenie do C#
C# (wymawiane "C sharp") to nowoczesny język programowania ogólnego przeznaczenia opracowany przez firmę Microsoft. Jest szeroko stosowany do tworzenia różnego rodzaju aplikacji, w tym aplikacji komputerowych, internetowych, mobilnych i gier. W tym przewodniku omówimy podstawy programowania w języku C#, w tym typy danych, zmienne, przepływ sterowania, funkcje, klasy, przestrzenie nazw i nie tylko.
Co więcej, C# oferuje bogaty zestaw funkcji i narzędzi, dzięki czemu jest wszechstronnym i wydajnym językiem programowania dla różnych dziedzin, w tym aplikacji komputerowych, tworzenia stron internetowych, aplikacji mobilnych i tworzenia gier przy użyciu technologii takich jak Unity. W miarę postępów w swojej podróży do C# możesz eksplorować bardziej zaawansowane tematy, takie jak dziedziczenie, polimorfizm, interfejsy, typy generyczne, LINQ (Language Integrated Query) i programowanie asynchroniczne przy użyciu zadań i async/await. Zrozumienie tych koncepcji zwiększy Twoje możliwości projektowania solidnych i skalowalnych aplikacji.
Zacznijmy od podstaw.
Konfigurowanie środowiska programistycznego
Aby rozpocząć kodowanie w języku C#, musisz skonfigurować środowisko programistyczne. Oto kroki, jak rozpocząć:
- Zainstaluj program Visual Studio: Pobierz i zainstaluj program Visual Studio z oficjalnej witryny firmy Microsoft. Visual Studio to potężne zintegrowane środowisko programistyczne (IDE), które zapewnia wszystkie narzędzia niezbędne do programowania w języku C#.
- Utwórz nowy projekt: Uruchom program Visual Studio i utwórz nowy projekt. Wybierz odpowiedni szablon projektu w oparciu o typ aplikacji, którą chcesz zbudować.
- Napisz kod: Po skonfigurowaniu projektu możesz rozpocząć pisanie kodu C# w edytorze kodu udostępnianym przez program Visual Studio.
Teraz, gdy masz już skonfigurowane środowisko programistyczne, przejdźmy do podstaw programowania w języku C#.
Program Witaj Świecie
Tradycyjne „Hello, World!” program jest często pierwszym programem, który piszesz w dowolnym języku programowania. Oto jak możesz to napisać w C#:
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
W tym przykładzie kodu najpierw uwzględniamy przestrzeń nazw 'System', która zawiera klasę o nazwie 'Console' do obsługi danych wejściowych i wyjściowych. Następnie definiujemy klasę o nazwie 'Program'. Wewnątrz tej klasy mamy metodę 'Main', która jest punktem wejścia programu C#. Na koniec używamy metody 'Console.WriteLine', aby wydrukować komunikat „Hello, World!” wiadomość do konsoli.
Zmienne i typy danych
W C# musisz zadeklarować variable zanim będziesz mógł z nich skorzystać. Zmienne przechowują wartości różnych typów danych. Oto kilka powszechnie używanych typów danych w języku C#:
- 'int': Reprezentuje liczby całkowite (np. 10, -5, 0).
- 'double': Reprezentuje liczby zmiennoprzecinkowe z miejscami dziesiętnymi (np. 3,14, -0,5).
- 'bool': Reprezentuje wartości logiczne (prawda lub fałsz).
- 'string': Reprezentuje sekwencję znaków (np. "Hello", "C#").
Oto przykład demonstrujący deklarację zmiennej i podstawowe operacje:
int age = 25;
double pi = 3.14;
bool isStudent = true;
string name = "John";
int sum = age + 5;
double circleArea = pi * 2 * 2;
bool isAdult = age >= 18;
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
Console.WriteLine("Sum: " + sum);
Console.WriteLine("Circle Area: " + circleArea);
Console.WriteLine("Is Adult? " + isAdult);
W tym przykładzie deklarujemy zmienne 'age', 'pi', 'isStudent' i 'name' wraz z ich odpowiednimi typy danych. Wykonujemy podstawowe operacje, takie jak dodawanie, mnożenie i porównywanie. Do wyświetlania wartości na konsoli używana jest metoda 'Console.WriteLine'.
Tablice i kolekcje
Tablice i kolekcje to podstawowe struktury danych w języku C#, które umożliwiają wydajne przechowywanie wielu wartości i manipulowanie nimi. Odgrywają kluczową rolę w różnych scenariuszach programowania i są szeroko stosowane w programowaniu w języku C#.
Tablice
Tablica w języku C# to kolekcja elementów tego samego typu o stałym rozmiarze. Oto przykład:
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
W tym przykładzie deklarujemy tablicę liczb całkowitych o nazwie 'numbers' i rozmiarze '5'. Inicjujemy tablicę określonymi wartościami, używając nawiasów klamrowych '{}'. Dostęp do poszczególnych elementów tablicy można uzyskać za pomocą notacji indeksowej, zaczynając od 0. Na przykład 'numbers[0]' daje pierwszy element.
Kolekcje
Kolekcje w języku C# zapewniają większą elastyczność niż tablice, ponieważ mogą dynamicznie rosnąć lub zmniejszać się. C# oferuje różne typy kolekcji, takie jak 'List<T>', 'Dictionary<TKey, TValue>' i 'HashSet<T>'.
Możesz utworzyć kolekcję ogólną, używając jednej z klas z przestrzeni nazw 'System.Collections.Generic'. Kolekcja ogólna jest przydatna, gdy każdy element kolekcji ma ten sam typ danych. Kolekcja ogólna wymusza silne pisanie, umożliwiając dodanie tylko żądanego typu danych.
using System.Collections.Generic;
Oto przykład użycia kolekcji 'List<T>':
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
names.Add("Charlie");
W tym przykładzie tworzymy listę ciągów o nazwie 'names' przy użyciu klasy inicjatora 'List<T>'. Do dodawania elementów do listy używamy metody 'Add()'.
Wartość 'List<T>' udostępnia wiele przydatnych metod i właściwości do pracy z kolekcjami, takich jak 'Count' w celu uzyskania liczby elementów, 'Remove()' w celu usunięcia element i 'Contains()', aby sprawdzić, czy element istnieje.
Iteracja po tablicach i kolekcjach
Możesz iterować po tablicach i kolekcjach, używając pętli, takich jak 'for' lub 'foreach', aby uzyskać dostęp do ich elementów i manipulować nimi. Oto przykład iteracji po tablicy i liście:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
Console.WriteLine(name);
}
W tym przykładzie używamy pętli 'foreach' do iteracji po każdym elemencie tablicy 'numbers' i listy 'names' i wypisujemy je do konsola.
Kontrola przepływu
Przepływ sterowania umożliwia podejmowanie decyzji i wykonywanie różnych bloków kodu w oparciu o warunki. Język C# udostępnia kilka struktur przepływu sterowania, w tym instrukcje 'if', instrukcje 'switch' i pętle.
'If'
Instrukcja 'if' umożliwia wykonanie bloku kodu tylko wtedy, gdy spełniony jest określony warunek. Oto przykład:
int number = 10;
if (number > 0)
{
Console.WriteLine("The number is positive.");
}
else if (number < 0)
{
Console.WriteLine("The number is negative.");
}
else
{
Console.WriteLine("The number is zero.");
}
W tym przykładzie sprawdzamy wartość zmiennej 'number' przy użyciu klauzul 'if', 'else if' i 'else'. W zależności od warunku zostanie wydrukowany odpowiedni komunikat.
'Switch'
Instrukcja 'switch' umożliwia wybranie jednego z wielu bloków kodu do wykonania w oparciu o wartość wyrażenia. Oto przykład:
int dayOfWeek = 2;
string dayName;
switch (dayOfWeek)
{
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
// ...
default:
dayName = "Invalid day";
break;
}
Console.WriteLine("Today is " + dayName + ".");
W tym przykładzie nazwę dnia przypisujemy na podstawie wartości 'dayOfWeek' za pomocą instrukcji 'switch'. Instrukcje 'case' określają możliwe wartości, a przypadek 'default' jest wykonywany, jeśli żaden z przypadków nie pasuje.
Instrukcje pętli
Pętle pozwalają na wielokrotne wykonanie bloku kodu, aż do spełnienia określonego warunku. C# udostępnia pętle 'for', 'while' i 'do-while'.
'For'
Pętla 'for' jest używana, jeśli z góry znana jest liczba iteracji. Oto przykład:
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Iteration: " + i);
}
W tym przykładzie pętla wykonuje się pięć razy, za każdym razem wypisując numer iteracji.
'While'
Pętla 'while' jest używana, gdy nie znasz z góry liczby iteracji, ale musisz sprawdzić warunek. Oto przykład:
int count = 0;
while (count < 5)
{
Console.WriteLine("Count: " + count);
count++;
}
W tym przykładzie pętla działa, aż zmienna 'count' osiągnie wartość 5.
'Do-While'
Pętla 'do-while' jest podobna do pętli while, ale warunek jest sprawdzany na końcu, więc pętla wykona się co najmniej raz. Oto przykład:
int num = 1;
do
{
Console.WriteLine("Number: " + num);
num++;
} while (num <= 5);
W tym przykładzie pętla działa, dopóki zmienna 'num' nie będzie już mniejsza lub równa 5.
Funkcje
Funkcje umożliwiają hermetyzację bloków kodu wielokrotnego użytku. C# obsługuje definiowanie funkcji przy użyciu słowa kluczowego 'void' w przypadku metod, które nie zwracają wartości, oraz innych typów danych w przypadku metod zwracających wartość. Oto przykład:
int Add(int a, int b)
{
return a + b;
}
void Greet(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
int result = Add(5, 3);
Greet("Alice");
W tym przykładzie definiujemy dwie funkcje: 'Add' i 'Greet'. Funkcja 'Add' przyjmuje dwa parametry całkowite i zwraca ich sumę. Funkcja 'Greet' pobiera parametr typu string i wyświetla komunikat powitalny. Następnie wywołujemy te funkcje z odpowiednimi argumentami.
Klasy i obiekty
C# jest językiem programowania zorientowanym obiektowo, co oznacza, że obsługuje tworzenie klas i obiektów. Klasy definiują plan tworzenia obiektów, które są instancjami tych klas. Oto przykład:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine("Hello, my name is " + Name + " and I'm " + Age + " years old.");
}
}
Person person = new Person();
person.Name = "John";
person.Age = 30;
person.SayHello();
W tym przykładzie definiujemy klasę 'Person' z właściwościami 'Name' i 'Age' oraz metodą 'SayHello'. Następnie tworzymy instancję klasy 'Person' przy użyciu słowa kluczowego 'new' i ustawiamy jej właściwości. Na koniec wywołujemy metodę 'SayHello' na obiekcie 'person'.
Koncepcje programowania obiektowego (OOP).
C# to obiektowy język programowania oferujący różne funkcje wspierające koncepcje OOP, takie jak dziedziczenie, enkapsulacja i polimorfizm.
Dziedzictwo
Dziedziczenie umożliwia tworzenie nowych klas w oparciu o istniejące klasy, dziedziczenie ich atrybutów i zachowań. Oto przykład:
class Shape
{
public virtual void Draw()
{
Console.WriteLine("Drawing a shape.");
}
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle.");
}
}
W tym przykładzie klasa 'Circle' dziedziczy po klasie 'Shape' przy użyciu symbolu ':'. Klasa 'Circle' zastępuje metodę 'Draw' z klasy bazowej, zapewniając własną implementację.
Kapsułkowanie
Hermetyzacja to praktyka polegająca na łączeniu danych i metod w klasę i kontrolowaniu ich dostępu. Możesz użyć modyfikatorów dostępu ('public', 'private', 'protected' itd.), aby określić widoczność elementów. Oto przykład:
class Person
{
private string name;
public string GetName()
{
return name;
}
public void SetName(string newName)
{
name = newName;
}
}
W tym przykładzie pole 'name' jest hermetyzowane w klasie 'Person' i można uzyskać do niego dostęp wyłącznie poprzez 'GetName' i * metody h81*.
Wielopostaciowość
Polimorfizm pozwala na traktowanie obiektów różnych klas jako obiektów wspólnej klasy bazowej. Umożliwia to napisanie kodu, który w jednolity sposób współpracuje z różnymi typami obiektów. Oto przykład:
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound.");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks.");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Cat meows.");
}
}
W tym przykładzie klasa 'Animal' ma wirtualną metodę 'MakeSound', która jest zastępowana przez klasy 'Dog' i 'Cat' zajęcia. Polimorfizm pozwala nam traktować instancje 'Dog' i 'Cat' jako instancje 'Animal' i wywoływać 'MakeSound' na nich metoda.
Obsługa wyjątków
Obsługa wyjątków umożliwia płynną obsługę błędów wykonawczych. W języku C# można używać bloków 'try-catch' do przechwytywania i obsługi wyjątków. Oto przykład:
try
{
int result = 10 / 0;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Divide by zero error: " + ex.Message);
}
finally
{
Console.WriteLine("Cleanup code goes here.");
}
W tym przykładzie próbujemy wykonać dzielenie przez zero, co wyrzuca 'DivideByZeroException'. Kod znajdujący się w bloku 'try' jest wykonywany i jeśli wystąpi wyjątek, jest przechwytywany przez blok 'catch'.
Blok 'finally' jest wykonywany niezależnie od tego, czy wystąpi wyjątek, czy nie, i zazwyczaj jest używany do operacji czyszczenia.
Obsługa wyjątków pomaga zapobiegać awariom programów i umożliwia kontrolowaną obsługę błędów i ich odzyskiwanie.
Wniosek
Ten obszerny przewodnik zawiera szczegółowe wprowadzenie do programowania w języku C#, obejmujące podstawy i podstawowe koncepcje języka. Zaczynając od skonfigurowania środowiska programistycznego i napisania „Hello, World!” programu, badaliśmy typy danych, zmienne, struktury przepływu sterowania, takie jak instrukcje if i pętle, oraz tworzenie funkcji. Zagłębiliśmy się w bardziej zaawansowane tematy takie jak klasy, obiekty, dziedziczenie, enkapsulacja, polimorfizm, a także obsługa wyjątków. Dodatkowo omówiliśmy wykorzystanie tablic i kolekcji do zarządzania wieloma wartościami. Dzięki tej wiedzy masz teraz solidne podstawy programowania w języku C#, umożliwiające tworzenie szerokiej gamy aplikacji, od aplikacji konsolowych po aplikacje internetowe i mobilne. Pamiętaj, aby kontynuować ćwiczenia i eksplorować rozległy ekosystem C#, aby udoskonalić swoje umiejętności i odblokować nieskończone możliwości.