·
// pytania i odpowiedzi C# / .NET

C# — Q&A

39pytań
0znasz

Pytania przygotowane tak, żebyś mógł zaznajomić się z tym czego możesz się spodziewać podczas rozmowy kwalifikacyjnej z C#. Kliknij pytanie żeby zobaczyć odpowiedź, a gdy je znasz — oznacz jako zaliczone ✓

🔍
39 pytań
🔎
Brak wyników
Spróbuj innej frazy
01 Czym jest C#? ✓ ▶

C# jest nowoczesnym, w pełni obiektowym językiem programowania opracowanym przez firmę Microsoft. Programy napisane w C# są kompilowane do języka pośredniego CIL (Common Intermediate Language), który jest wykonywany przez środowisko uruchomieniowe .NET Framework.

Nazwa języka powstała analogicznie do C++. Symbol kratki # przypomina połączone dwa operatory ++, co symbolizuje "więcej niż C++".

Podstawy języka
02 Czym są tablice 'Jagged Array' w języku C#? ✓ ▶

Jagged Array (tablica postrzępiona) to tablica w tablicy. Każda podtablica może mieć inny rozmiar.

int[][] scores = new int[2][]{new int[]{71,72,73},new int[]{32,33,34,35}};

Tablica scores[0] zawiera 3 liczby całkowite, a scores[1] — 4 liczby całkowite.

Typy i struktury
03 Na ile sposobów można przekazać parametry do metody? ✓ ▶

Istnieją trzy sposoby przekazywania parametrów do metody:

  • Wartościowe (value parameters) — kopia wartości; zmiany wewnątrz metody nie wpływają na oryginał.
  • Referencyjne (ref) — przekazanie adresu w pamięci; zmiany w metodzie wpływają na argument. Zmienna musi być wcześniej zainicjalizowana.
  • Wyjściowe (out) — jak ref, ale zmienna nie musi być zainicjalizowana przed wywołaniem. Musi zostać przypisana wewnątrz metody.
Podstawy języka
04 Czy można zwrócić wiele wartości z funkcji w C#? ✓ ▶

Tak! W tym celu należy użyć parametrów wyjściowych out. Instrukcja return pozwala zwrócić tylko jedną wartość, natomiast użycie out umożliwia zwrócenie wielu parametrów. W nowszych wersjach C# można też używać Tuple lub dekonstrukcji.

Podstawy języka
05 Czym są przestrzenie nazw (namespace) w C#? ✓ ▶

Przestrzenie nazw zostały zaprojektowane po to, aby zachować odrębność jednych nazw od drugich. Nazwy klas zadeklarowane w jednej przestrzeni nazw nie są w konflikcie z takimi samymi nazwami klas zadeklarowanymi w innej przestrzeni nazw.

Podstawy języka
06 Jaki jest cel używania słowa kluczowego using w C#? ✓ ▶

using pozwala na dodanie przestrzeni nazw do projektu. Na ogół program używa wielu takich instrukcji.

Z drugiej strony pozwala na tzw. "szybkie wykorzystanie obiektu". Po wyjściu z bloku using obiekt taki zostaje automatycznie usunięty — implementuje on wzorzec IDisposable.

Podstawy języka
07 Czym są typy wartościowe w C#? ✓ ▶

Typy wartościowe to typy, do których wartość może zostać przypisana bezpośrednio. Dziedziczą z klasy System.ValueType. Zawierają dane bezpośrednio w pamięci stosu (stack).

Zaliczamy do nich: int, char, float, double, long, byte, bool oraz typy wyliczeniowe (enum) i struktury (struct).

Typy i struktury
08 Czym są typy referencyjne w C#? ✓ ▶

Typy referencyjne nie przechowują rzeczywistych wartości, a jedynie odniesienia (referencje) do danych na stercie (heap). Do typów referencyjnych zaliczamy klasy, delegaty, interfejsy, tablice i string.

Główna różnica: w przypadku typów referencyjnych nie wiadomo z góry ile miejsca zajmie obiekt. Kompilator umieszcza referencję na stosie, a sam obiekt na stercie — zarządzanej przez Garbage Collector.

Typy i struktury
09 Czym jest boxing w C#? ✓ ▶

Boxing to operacja, w której typ wartościowy jest konwertowany na typ obiektowy (object). Wartość jest "pakowana" i umieszczana na stercie.

int i = 123; // Boxing — i jest pakowane do obiektu object o = i;
Typy i struktury
10 Czym jest unboxing w C#? ✓ ▶

Unboxing to odwrotna operacja względem boxing — typ obiektowy (object) jest konwertowany z powrotem na typ wartościowy. Wymaga jawnego rzutowania i może rzucić InvalidCastException.

o = 123; i = (int)o; // unboxing
Typy i struktury
11 Czym są typy dynamiczne w C#? ✓ ▶

W typach dynamicznych można przechowywać każdy rodzaj wartości. Typ przechowywanej wartości będzie dopiero sprawdzany w momencie wykonywania aplikacji (runtime), a nie w czasie kompilacji.

dynamic nazwaZmiennej = value;
Typy i struktury
12 Jaka jest różnica pomiędzy typami dynamicznymi a wartościowymi? ✓ ▶

Typy dynamiczne są podobne do typów wartościowych z tą różnicą, że sprawdzenie typów wartościowych odbywa się w trakcie kompilacji kodu, a sprawdzenie typów dynamicznych odbywa się w trakcie wykonywania aplikacji (runtime).

Typy i struktury
13 Czym są wskaźniki (pointer) w C#? ✓ ▶

C# obsługuje wskaźniki w ograniczonym zakresie. Wskaźnik to zmienna przechowująca adres pamięci innego typu — wyłącznie typów wartościowych i tablic.

int* ptr; int x = 100; int* ptr = &x; Console.WriteLine((int)ptr); // Adres pamięci Console.WriteLine(*ptr); // Wartość

Używanie wskaźników wymaga tzw. unsafe context. Operacje takie wykonywane są poza kontrolą Garbage Collector.

Zaawansowane
14 Co należy wiedzieć o Garbage Collector? ✓ ▶

W C# Garbage Collector (GC) zajmuje się automatycznym czyszczeniem pamięci. GC traktuje wszystkie obiekty jako niepotrzebne, o ile nie zaznaczono inaczej — zakłada, że szybciej zostanie usunięty obiekt krótkotrwały niż długotrwały.

Sterta (heap) to część pamięci wirtualnej przydzielana aplikacji, oddzielna dla każdej uruchamianej instancji. Obiekty trafiają na stertę, a GC — działający w osobnym wątku — zwalnia te, do których nie ma już referencji.

GC uruchamia się m.in. gdy kończy się pamięć na stercie lub gdy OS sygnalizuje jej brak. Gdyby w .NET nie było GC, każdy programista musiałby sam zarządzać pamięcią — jak w C++.

Zaawansowane
15 Jaki jest cel używania operatora is w C#? ✓ ▶

Operator is jest operatorem rzutowania. Zwraca true jeżeli rzutowanie się powiedzie, false jeżeli będzie niepoprawne. Stosowany najczęściej w instrukcji warunkowej if.

int i = 3; if(i is object) // true if(i is string) // false
Typy i struktury
16 Jaki jest cel używania operatora as w C#? ✓ ▶

Operator as dokonuje rzutowania bez rzucania wyjątku, gdy rzutowanie się nie powiedzie — zamiast tego zwraca null.

int i = 3; string result = i as string; // null — nie rzuca wyjątku
Typy i struktury
17 Czym jest enkapsulacja? ✓ ▶

Enkapsulacja (hermetyzacja) to ukrywanie elementów, do których użytkownik nie powinien mieć dostępu. Ograniczamy dostęp do zmiennych i metod wykonywanych wewnątrz klasy przez modyfikatory dostępu.

  • public — brak ograniczeń, dostępne dla wszystkich;
  • private — tylko dla metod tej samej klasy;
  • protected — klasa i klasy dziedziczące;
  • internal — klasy w tej samej bibliotece (assembly);
  • protected internal — klasy dziedziczące, nawet z innych bibliotek.
OOP i dziedziczenie
18 Czym są typy dopuszczające wartości puste (nullable types) w C#? ✓ ▶

Nullable types pozwalają przypisać typowi wartościowemu zarówno jego normalny zakres wartości, jak i wartość null.

Dla przykładu, do zmiennej Nullable<Int32> można przypisać dowolną wartość z zakresu int lub null. Skrócona składnia to int?.

Typy i struktury
19 Jak używać operatorów ? oraz ?? w języku C#? ✓ ▶

Operatory te skracają zapis konstrukcji if..else:

  • ? (ternary): condition ? expr1 : expr2 — gdy warunek prawdziwy zwraca expr1, inaczej expr2.
  • ?? (null-coalescing): zwraca wartość po lewej stronie jeśli nie jest null, w przeciwnym razie wartość po prawej.
int? wynik = null; return wynik ?? -1; // zwróci -1, bo wynik jest null
Podstawy języka
20 Czy w C# można utworzyć metodę przyjmującą zmienną liczbę parametrów? ✓ ▶

Tak, używając słowa kluczowego params. Metoda taka może przyjąć zmienną liczbę parametrów, w tym zero.

int SumParameters(params int[] values) { int sum = 0; foreach (var item in values) sum += item; return sum; } // Wywołania: int r1 = SumParameters(1, 2, 3, 4); int r2 = SumParameters(144, 21);
Podstawy języka
21 Używając słowa kluczowego params — czy można przekazać dodatkowe parametry? ✓ ▶

Można, ale dodatkowe parametry muszą wystąpić przed słowem kluczowym params.

int SumParameters(string example, params int[] values) { int sum = 0; foreach (var item in values) sum += item; return sum; } SumParameters("Przykład", 1, 2, 3, 4);
Podstawy języka
22 Która klasa jest klasą bazową dla wszystkich tablic (arrays) w C#? ✓ ▶

Klasa Array jest klasą bazową dla wszystkich tablic w C#, zdefiniowaną w przestrzeni nazw System. Dostarcza właściwości i metody do pracy z tablicami, takie jak Length, Sort(), Reverse() czy IndexOf().

Typy i struktury
23 Jak sortować tablice w C#? ✓ ▶

Należy użyć metody Array.Sort(array) — sortuje elementy tablicy rosnąco używając implementacji IComparable. Dla kolejności malejącej stosujemy Array.Reverse(array).

Interfejs IComparable umożliwia sortowanie obiektów niestandardowych — wystarczy zaimplementować metodę CompareTo(T).

Typy i struktury
24 Czym są struktury w C#? ✓ ▶

Struktura w C# to wartościowy typ danych (value type). Pozwala na utworzenie pojedynczej zmiennej przechowującej dane różnych typów — deklarowana słowem kluczowym struct. Używana do reprezentacji lekkich rekordów danych.

Typy i struktury
25 Jakie są różnice pomiędzy klasą a strukturą w C#? ✓ ▶
  • klasy są typem referencyjnym, struktury są typem wartościowym;
  • struktury nie mogą dziedziczyć po sobie (ale mogą implementować interfejsy);
  • struktury nie mogą mieć domyślnego konstruktora bezparametrowego.
OOP i dziedziczenie
26 Czym jest typ wyliczeniowy (enum) w C#? ✓ ▶

Typ wyliczeniowy to zbiór nazwanych, stałych liczb całkowitych. Deklarowany słowem kluczowym enum. Jest wartościowym typem danych — nie może dziedziczyć po innych typach wyliczeniowych.

enum ApplicationStatus { Save = 1, SaveAs = 2, Suspend = 5, Delete = 99 }

Jeśli wartości nie zostaną zdefiniowane, zostaną przypisane automatycznie — pierwszy element dostaje wartość 0.

Typy i struktury
27 Jaki jest domyślny modyfikator dostępu dla klasy? ✓ ▶

Domyślny modyfikator dostępu dla klasy to internal — składowe wewnętrzne są dostępne tylko dla klas w tej samej bibliotece (assembly).

OOP i dziedziczenie
28 Jaki jest domyślny modyfikator dostępu dla składników klasy? ✓ ▶

Składniki klasy (pola, metody, właściwości) mają domyślny modyfikator private — dostępne tylko dla metod tej samej klasy.

OOP i dziedziczenie
29 Czym jest dziedziczenie w C#? ✓ ▶

Dziedziczenie to kluczowy mechanizm obiektowości — pozwala klasom pochodnym przejąć pola i metody klasy bazowej bez ich powielania. Klasa dziedzicząca ma dostęp do publicznych i chronionych składowych klasy bazowej.

Wywołanie konstruktora klasy bazowej odbywa się za pomocą słowa kluczowego base — pod warunkiem, że konstruktor bazowy nie jest prywatny.

OOP i dziedziczenie
30 Czy wielokrotne dziedziczenie klas jest możliwe w C#? ✓ ▶

Nie — C# nie obsługuje wielokrotnego dziedziczenia klas. Klasa może dziedziczyć tylko po jednej klasie bazowej. Wielokrotne dziedziczenie można zastąpić implementacją wielu interfejsów.

OOP i dziedziczenie
31 Czym jest polimorfizm w C#? ✓ ▶

Polimorfizm to zdolność obiektu do różnych zachowań zależnie od bieżącego wykonania. Wyróżniamy dwa rodzaje:

  • Statyczny (compile-time) — przeciążanie metod i operatorów. Metoda wywoływana wybierana jest na etapie kompilacji na podstawie liczby parametrów.
  • Dynamiczny (runtime) — przesłanianie metod wirtualnych słowem override. Metoda abstrakcyjna musi być przesłonięta, wirtualna — może.
OOP i dziedziczenie
32 Czym jest przeciążanie metod w C#? ✓ ▶

W danej klasie może znajdować się wiele metod o tej samej nazwie, o ile różnią się liczbą lub typami parametrów. Nie można przeciążyć metody, która różni się jedynie typem zwracanej wartości.

OOP i dziedziczenie
33 Modyfikator dostępu sealed w C#. ✓ ▶

Klasa opatrzona modyfikatorem sealed nie może być dziedziczona. Użycie tego modyfikatora może przynieść zysk wydajnościowy — wywołanie metod wirtualnych jest nieco wolniejsze, bo wymaga sprawdzenia polimorfizmu. Modyfikator sealed można stosować również do przesłoniętych metod.

Zaawansowane
34 Jak utworzyć klasę abstrakcyjną opatrzoną modyfikatorem sealed w C#? ✓ ▶

W języku C# nie ma takiej możliwości. Nie można jednocześnie użyć modyfikatorów abstract i sealed dla tej samej klasy — są to wzajemnie wykluczające się pojęcia.

Zaawansowane
35 Czym są metody wirtualne w C#? ✓ ▶

Metody virtual pozwalają na zastosowanie polimorfizmu dynamicznego. W klasie bazowej przygotowujemy metodę wirtualną (z opcjonalną implementacją). Klasy dziedziczące mogą ją przesłonić słowem kluczowym override.

Jeśli klasa dziedzicząca nie przesłoni metody, zostanie użyta domyślna implementacja z klasy bazowej.

OOP i dziedziczenie
36 Czym jest interfejs w C#? ✓ ▶

Interfejs definiuje kontrakt — zestaw metod i właściwości, które klasa musi implementować. Nie zawiera kodu implementacji (z wyjątkiem default interface methods w C# 8+).

  • nie można dodawać pól ani konstruktora;
  • wszystkie elementy są domyślnie publiczne;
  • nie można zagnieżdżać klas ani typów wyliczeniowych;
  • interfejs może dziedziczyć po innym interfejsie.
OOP i dziedziczenie
37 Czym są dyrektywy preprocesora w C#? ✓ ▶

Dyrektywy preprocesora przekazują instrukcje do kompilatora przed rzeczywistą kompilacją. Zaczynają się od znaku #, nie kończą się średnikiem. Popularne dyrektywy:

  • #if / #DEBUG — warunkowa kompilacja, np. do wyświetlania logów w trybie debug;
  • #region / #endregion — grupowanie i ukrywanie bloków kodu;
  • #error — wymuszenie błędu kompilacji w określonej lokalizacji;
  • #define / #undef — tworzenie i usuwanie symboli boolowskich używanych w warunkowej kompilacji.
Zaawansowane
38 Która klasa jest klasą bazową dla wszystkich wyjątków w C#? ✓ ▶

Wyjątki w C# są reprezentowane przez klasy, które dziedziczą pośrednio lub bezpośrednio z klasy System.Exception. Dwie ważne podklasy to System.ApplicationException oraz System.SystemException.

Wyjątki i błędy
39 Jaka jest różnica pomiędzy System.ApplicationException a System.SystemException? ✓ ▶

System.ApplicationException obsługuje wyjątki wygenerowane przez aplikację. Wszystkie wyjątki zdefiniowane przez programistę powinny pochodzić z tej klasy.

System.SystemException to klasa bazowa dla wszystkich wcześniej zdefiniowanych wyjątków systemowych (.NET runtime).

Wyjątki i błędy