# C# in a nutshell: czyli co, jak i z czym
## Podstawowe typy zmiennych
* `int` - liczba całkowita
* `string` - tekst, w kodzie zapisywany w cudzysłowach ""
* `bool` - `true` / `false`
## Obsługa konsoli
```
Console.WriteLine($"Hi, my name is {Name}.");
```
`Console.WriteLine()` pozwala wypisać zawartość nawiasów na ekran konsoli. \
Poprzedzenie stringa znakiem `$` spowoduje, że zamiast zawartości nawiasów klamrowych {} będzie wyświetlana wartość zmiennej o podanej w klamrach nazwie.
Dla powyższego przykładu, jeśli zmienna `Name` ma wartość `zombie`, wyświetlone będzie `Hi, my name is zombie`
> `Console.WriteLine()` można szybko utworzyć, wpisując `cw` i klikając dwukrotnie tab
```
Console.ReadLine()
```
Powyższa metoda pozwala na wczytanie tekstu z konsoli. Dokładniejsze użycie będzie pokazane na kolejnych wykładach.
## If, else
```
if (enemy.IsAlive)
{
Console.WriteLine($"{Name} got hit for {enemy.Dmg} dmg. ");
}
else
{
Console.WriteLine($"{enemy.Name} tried to attack {Name}, but he is dead already.");
}
```
Jeśli (`if`) spełniony jest warunek podany w nawiasach ( ) , wykonaj zawartość { } po nim. W innym wypadku (`else`) wykonaj kod w {} po else.
## Pętla while
```
while (me.IsAlive && enemy.IsAlive)
{
enemy.GetHit(me);
me.GetHit(enemy);
}
```
Wykonuj kod w nawiasach klamrowych { } tak długo, dopóki spełniony jest warunek podany w nawiasach ( )
## Zmienne boolowskie
Wcześniej wspominałem, że zmienna bool ma zawsze wartość `true` lub `false`. \
Za pomocą operatorów `&&`, `||`, `!` można tworzyć bardziej złożone warunki.
* `me.IsAlive && enemy.IsAlive` - logiczne and, muszą być spełnione OBA warunki `me.IsAlive` i `enemy.IsAlive`.
* `me.IsAlive || enemy.IsAlive` - logiczne or, musi być spełniony co najmniej jeden z warunków
* `!me.IsAlive` - logiczne not, warunek jest spełniony, gdy `me.IsAlive = false`
## Klasy i obiekty
```
namespace ConsoleRPG
{
class Character
{
/* ... */
}
}
```
`Klasa` jest ogólną definicją "czegoś", zawierającą `pola` (czyli wartości, które opisującą `obiekt`) oraz `metody` (czyli czynności, które może wykonywać obiekt, lub które mogą być wykonywane na nim). \
`Obiekt` jest implementacją klasy.
Powyżej widzimy przykładową klasę. Znajduje się ona w `namespace ConsoleRPG`, co w dużym uproszczeniu jest po prostu nazwą folderu,
w którym się znajduje (najniższy poziom namespace'u jest taki sam jak nazwa projektu). \
Obiekt należący do klasy Character możemy zdefiniować w poniższy sposób.
```
Character me = new Character
{
Name = "Zombie",
Dmg = 3,
Hp = 9
};
```
### Pola klasy
`Pola klasy` są wartościami opisującymi obiekt należący do tej klasy.\
Przykładowe pola klasy:
```
private string Name;
```
Słowo kluczowe `private` ozancza, że to pole jest dostępne tylko dla metod wewnątrz klasy.
```
public int Dmg { get; set; }
```
Słowo kluczowe `public` oznacza, że to pole jest dostępne "z zewnątrz" obiektu.
Powyższa instrukcja jest skróconą wersją stwierdzenia, że istnieje pole Dmg i możemy publicznie odczytać (get) i zmienić (set) jej wartość.
> Można szybko utworzyć takie pole wpisując w `prop` i wciskając dwukrotnie tab.
Do pól klasy można się odwołać w poniższy sposób:
```
me.Dmg = 3 // set
Console.WriteLine(me.Dmg) // get
```
Nie wszystkie pola muszą udostępniać możliwość odczytu (get) i zmiany (set). Dla przykładu
```
public bool IsAlive
{
get { return Hp > 0; }
}
```
Pozwala na odczytanie wartości zmiennej IsAlive, ale nie pozwala na jej ustawienie.
### Metody
Metody są czynnościami, które mogą być wykonywane przez obiekt lub na obiekcie danej klasy.
```
public void Introduce()
{
Console.WriteLine($"Hi, my name is {Name}. My damage is {Dmg} and my hp is {Hp}.");
}
```
Słowo kluczowe `public` działa na takiej samej zasadzie jak powyżej. Zaraz po nim znajduje się typ zwracany przez funkcję,
w tym wypadku `void`, który oznacza, że funkcja nic nie zwraca. \
W metodach należących do klasy można się odwoływać do wszystkich pól z tej klasy.
Metody mogą także przyjmować argumenty:
```
public void GetHit(int dmg)
{
Hp -= dmg;
}
```
> Operacja `Hp -= dmg` oznacza to samo co `Hp = Hp - dmg`
Metodę należącą do klasy możemy wywołać w poniższy sposób:
```
me.Introduce();
enemy.GetHit(me);
```
## Słowo kluczowe `static`
To słowo kluczowe zostanie dokładniej omówione na późniejszych wykładach, jednak pozwala ono na dostęp do pól i metod klasy, bez utworzenia jej obiektu. \
Dla przykładu:
```
Console.WriteLine();
```
Metoda `WriteLine()` jest statyczną metodą, należącą do klasy `Console`, więc nie musimy tworzyć obiektu tej klasy, aby skorzystać z tej metody.
Warto zauważyć, że pisząc statyczną metodę wewnątrz klasy, może się ona odwoływać tylko do innych statycznych pól i metod z tej klasy.
###### tags: `.Net PG` `C#`