Blog Dla Młodszych Programistów C#/.NET

Najwyższy czas przeanalizować kolejne pytania, które możesz dostać na rozmowie kwalifikacyjnej na stanowisko młodszego programisty .NET. Tak samo jak to było w poprzednich artykułach, dzisiaj znowu przejdziemy przez 10 takich najbardziej popularnych pytań.

100 Pytań (i Odpowiedzi!) z Rozmów Kwalifikacyjnych Dla Młodszych Programistów C#/.NET (Część 4/10)


31) Wyjaśnij zastosowanie słowa kluczowego using w C#


Słowo kluczowe using ma w C# 2 zastosowania.

Po pierwsze dzięki niemu możemy dołączyć różne przestrzenie nazw. A co za tym idzie, nie musimy za każdym razem, jak tworzymy klasy z innych przestrzeni nazw podawać ich pełnej nazwy wraz z przestrzenią nazw.

Możemy także użyć bloku using, dzięki któremu mamy pewność, że obiekt, który zostanie przekazany, zostanie poprawnie zwolniony. To znaczy, zostanie na nim wywołana za każdym razem, po zakończeniu instrukcji metoda Dispose. Taki blok using jest tym samym co blok try finally, zakładając, że w bloku finally mamy wywołanie metody Dispose. Musimy tylko pamiętać, że obiekt przekazywany do instrukcji using musi implementować interface IDisposable.

using System;
using System.Collections.Generic;
using (var student = new Student())
{
}


32) Czym są dyrektywy preprocesora w C#?


Dyrektywy preprocesora rozpoczynają się od znaku # i mają na celu wskazać kompilatorowi miejsce, w którym powinien najpierw przetworzyć informacje, zanim dojdzie do kompilacji. W C# mamy kilka takich dyrektyw, między innymi #if, #else, #elif, #endif, #define, #undef, #region, #endregion, #line, #error, #warning.

        static void Main(string[] args)
        {
#if DEBUG
            Console.WriteLine("DEBUG");
#else
            Console.WriteLine("RELEASE");
#endif
        }


33) Jaka jest różnica pomiędzy strukturą, a klasą?


Między struktura a klasą jest kilka różnic. Na początek warto wspomnieć, że klasa jest typem referencyjnym, a struktura jest typem wartościowym. Struktury w przeciwieństwie do klas nie wspierają dziedziczenia, nie mogą mieć jawnie określonego konstruktora bez parametrów, nie mają destruktorów, w momencie deklaracji nie możesz przypisać wartości dla pól. Strukturą jest np. Point, a klasą np. object. Struktury to są, można powiedzieć, takie ograniczone klasy, które mogą być lepszym wyborem, gdy klasa zawiera niewielką ilość danych. W takim przypadku zarządzanie nią na stercie może nie być opłacalne.

public struct MyStruct
{
    public int Number1;
}

public class MyClass
{
    public int Number1 = 1;
}


34) Czym są partial class (klasy częściowe) w C#?


Klasy częściowe, tak samo zresztą, jak metody możemy stworzyć dzięki słowu kluczowemu partial. To znaczy, możemy podzielić daną klasę na kilka części, w osobnych plikach. W czasie kompilacji wszystkie te klasy częściowe zostają połączone w jedną klasę. Aby można było stworzyć taką klasę, to każda z części musi zostać właśnie oznaczona słowem partial, wszystkie części muszą mieć taki sam modyfikator dostępu. Wystarczy, że jedna z nich dziedziczy po innym typie i automatycznie wszystkie częściowe klasy mają dostęp do typu bazowego. Tak samo, jeżeli dowolna część jest zadeklarowana jako sealed albo abstract, to dotyczy to wszystkich częściowych klas.

partial class Student : Person
{
}

partial class Student
{
}


35) Jaka jest różnica pomiędzy int, a Int32?


Int jest słowem kluczowym w C#, który odnosi się do typu System.Int32. Te zapisy w C# oznaczają to samo. Jednak zaleca się stosować słowo kluczowe int. Wszystkie pozostałe typy proste mają swoje odpowiedniki słowa kluczowe w C#.

int number1 = 1;
Int32 number2 = 1;


36) Czym jest enum w C#?


Enum jest to tzw. typ wyliczeniowy, dzięki któremu możemy zdefiniować nazwy stałych dla konkretnych wartości. Domyślnie wartości enum są mapowane na int.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

private static Season _actualSeason;

static void Main(string[] args)
{
    _actualSeason = Season.Winter;
}


37) Czym jest tuple w C#?


Funkcja tuple udostępnia składnie do grupowania wielu elementów danych. Czyli umożliwia nam stworzenie jednocześnie wiele typów naraz. Jednym z najbardziej typowych przypadków użycia tuple jest zwracany typ metody. Zamiast definiować parametry metody out, czy ref, lub tworzyć nową klasę, którą chcemy zwrócić z metody, można grupować wyniki w zwracany typ tuple.

public (int Id, string Name) GetResult()
{
    return (0 , "100");
}


var result = GetResult();
Console.WriteLine(result.Id);
Console.WriteLine(result.Name);

(double Sum, int Count) = (1.2, 10);


38) Czym jest sygnatura metody?


Sygnatura metody składa się opcjonalnie z poziomu dostępu, wartości zwracanej, nazwy metody i listy parametrów. Co ważne zwracany typ metody nie jest częścią sygnatury w przypadku przeciążania metody. Jednak jest jej częścią podczas określania zgodności między delegatem, a metodę, na którą wskazuje.

public int GetResult();
public void Display();


39) Na czym polega przeciążenie metod, konstruktorów, operatorów w C#?


Przeciążenie ma miejsce wtedy, gdy istnieje więcej metod o takiej samej nazwie, lecz o innej sygnaturze. Czyli np. każda metoda ma inne parametry, ilość parametrów, lub typ.

W przypadku konstruktorów dotyczy to sytuacji, w której w jednej klasie istnieje więcej niż jeden konstruktor. W takiej sytuacji muszą różnić się parametrami.

Przeciążenie operatora jest to sytuacja, w której tworzymy metody, dzięki którym będziemy mogli używać tych operatorów na obiektach. Czyli np. możemy w klasie przeciążyć operator dodawania, dzięki któremu zdefiniujemy, w jaki sposób można dane obiekty między sobą dodawać.

public class Student 
{
    public Student()
    {
    }

    public Student(int age)
    {
        Age = age;
    }

    public int Age { get; set; }

    public void DisplayResult()
    {
    }

    public void DisplayResult(int age)
    {
    }

    public void DisplayResult(string name)
    {
    }

    public void DisplayResult(int age, string name)
    {
    }

    public static Student operator +(Student student1, Student student2)
    {
        return new Student { Age = student1.Age + student2.Age };
    }
}

var student1 = new Student { Age = 1 };
var student2 = new Student { Age = 4 };
Console.WriteLine((student1 + student2).Age);//5


40) Na czym polega cykliczna referencja?


Cykliczna referencja ma miejsce w przypadku gdy dwa elementy są od siebie nawzajem zależne, co w konsekwencji powoduje, że dany zasób nie nadaje się do użytku. W takim przypadku najczęściej wystarczy utworzyć interfejs i usunąć odwołanie cykliczne.


ZAKOŃCZENIE


Tyle pytań w tym artykule. Do kolejnych zapraszam Cię już w kolejnych materiałach. Jeżeli taki materiał Ci się spodobał, to koniecznie dołącz do mojej społeczności – darmowe zapisy, gdzie będziesz również miał dostęp do dodatkowych materiałów.

To wszystko na dzisiaj, do zobaczenia w kolejnym artykule.

Poprzedni artykuł - 100 Pytań (i Odpowiedzi!) z Rozmów Kwalifikacyjnych Dla Młodszych Programistów C#/.NET (Część 3/10).
Następny artykuł - 100 Pytań (i Odpowiedzi!) z Rozmów Kwalifikacyjnych Dla Młodszych Programistów C#/.NET (Część 5/10).
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
Programista C#/.NET. Specjalizuje się w ASP.NET Core, ASP.NET MVC, ASP.NET Web API, Blazor, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Komentarze (2)
Ela
ELA, 17 grudnia 2022 21:23
Dziękuję za bardzo wartościowe treści ;) Chciałabym dopytać o zadanie dotyczące struktur. Dlaczego nie można przypisać wartości deklarowanego pola? U mnie public int Number1 { get; set; } = 1; działa również wewnątrz struktury, a jest to podane jako różnica pomiędzy strukturą a klasą.
Kazimierz Szpin
KAZIMIERZ SZPIN, 20 grudnia 2022 07:56
@ELA, tutaj chodzi o pola, a nie o właściwości - mój błąd, dobrze napisałem, ale podałem zły przykład :)
Dodaj komentarz

Wyszukiwarka

© Copyright 2024 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin