Przejdź do treści stopki
Iron Academy Logo
Naucz się C#
Naucz się C#

Inne Kategorie

Zrozumienie właściwości w C#

[[academy-video-youtube({"vid": "_hQPSOocXs0", "start_time": "0", "title": "Understanding C# Properties", "creator": "Tim Corey", "length": "9m 50s"})]]

C# 11, wprowadzony wraz z .NET 7, przyniósł ekscytujący dodatek do własności: słowo kluczowe required. W tym artykułe zbadamy właściwości C# z przykładami z zwięzłego samouczka wideo Tima Coreya pt. ".NET 7 Update: Required Properties in 10 Minutes or Less". Rozłożymy wszystko od podstaw właściwości po nowe słowo kluczowe required i sposób, w jaki pomaga ono wymusić zasady inicjalizacji.

Właściwości C

W C# właściwości pozwalają kapsułkować pola i zarządzać dostępem do członków danych klasy obiektu. Są powszechnie używane do zapewniania integralności danych przy jednoczesnym umożliwieniu dostępu zewnętrznego. Prywatne pole można kapsułkować za pomocą właściwości, oferując kontrolę nad sposobem dostępu do danych lub ich modyfikacji. Publiczne właściwości typu string często korzystają ze specjalnych metod zwanych akcesorami (get i set) do efektywnego manipulowania członkami klasy. Statyczna właściwość w C# może być dostępna bez tworzenia instancji klasy, oferując unikalny sposób zarządzania wartościami właściwości.

Oto jak Tim ustawia prosty przykład właściwości do demonstracji.

Tworzenie aplikacji konsolowej

Najpierw Tim zaczyna od podstawowej aplikacji konsolowej .NET 7 przy użyciu C# 11. Ta wersja wprowadza słowo kluczowe required, które nie jest dostępne w poprzednich wersjach .NET.

Definiowanie prostego modelu

Tim tworzy klase PersonModel z wlasciwosciami dla FirstName i LastName:

public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Te wlasciwosci pozwalaja PersonModel na przechowywanie imion i nazwisk. Jednak bez dodatkowej konfiguracji FirstName i LastName moglyby potencjalnie pozostac niezainicjowane, co skutkowaloby wartosciami null.

Używanie konstruktorów do zapewnienia inicjalizacji

Powszechnym sposobem zapewnienia, że właściwości są zawsze inicjowane, jest użycie konstruktóra. W przykladzie Tima dodaje on konstruktor do klasy bazowej PersonModel, ktory wymaga zarowno FirstName, jak i LastName:

public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}
public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}

To podejscie wymusza, aby zawsze, gdy tworzony jest obiekt PersonModel, byly dostarczone obie wartosci FirstName i LastName. Gdybysmy probowali stworzyc PersonModel bez okreslenia tych wartosci, kompilator zasygnalizowalby to jako blad.

Kontekst dla nullables

Poczawszy od .NET 6 i C# 10, C# wprowadzil typy referencyjne dopuszczajace null. Oznacza to, ze wlasciwosci musza byc albo zainicjowane, albo wyraznie oznaczone jako dopuszczajace null za pomoca ?. Na przyklad, jesli FirstName i LastName moga byc null, zdefiniowalibysmy je w nastepujacy sposob:

public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }

W przykladzie Tima zakladamy jednak, ze FirstName i LastName zawsze powinny byc nie-null. Początkowo, obsługę nullów zapewniała ostrożna inicjalizacja lub adnotacje nullables, ale wraz z C# 11, mamy bardziej solidne opcje.

Wprowadzenie słowa kluczowego required

Chociaz konstruktory moga wymuszac inicjalizacje, C# 11 wprowadza slowo kluczowe required, co ulatwia upewnianie sie, ze konkretne wlasciwosci sa ustawione. Dzieki required, mozna oznaczac indywidualne wlasciwosci jako wymagane, co oznacza, ze musza byc przypisane podczas inicjalizacji obiektu.

Konfiguracja właściwości required

Aby uczynic FirstName i LastName wymaganymi wlasciwosciami, Tim o godzinie 4:15 modyfikuje klase PersonModel w nastepujacy sposob:

public class PersonModel
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}
public class PersonModel
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}

Oznaczajac te wlasciwosci required, kompilator teraz wymusi ich ustawienie albo przez inicjator obiektu, albo konstruktor. Jest to przydatne, ponieważ pozwala na wymaganie określonych właściwości bez konieczności tworzenia konstruktóra.

Przykładowe zastosowanie z wymaganymi właściwościami

Teraz mozemy stworzyc i zainicjowac PersonModel w nastepujacy sposob:

PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };
PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };

Jesli pominelismy FirstName lub LastName, kompilator zasygnalizuje blad, wzywajac do inicjalizacji tych wymaganych wlasciwosci.

Użycie required z konstruktórami

Tim demonstruje przypadek, w ktorym uzywane sa zarowno wlasciwosci required jak i konstruktory. W sytuacjach, gdy mamy do czynienia z konstruktorem, który ustawia wymagane właściwości, język C# musi zapewnić, że właściwości te są nadal inicjowane w momencie wywołania konstruktóra.

W takich przypadkach atrybut SetsRequiredMembers moze byc uzyty, aby zasygnalizowac, ze konstruktor spelnia wymagane warunki. Oto, jak Tim to stosuje:

[SetsRequiredMembers]
public PersonModel()
{
    FirstName = "Test";
    LastName = "Test";
}

[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}
[SetsRequiredMembers]
public PersonModel()
{
    FirstName = "Test";
    LastName = "Test";
}

[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}

Dodanie SetsRequiredMembers informuje kompilator, ze te wlasciwosci zostana ustawione w konstruktorze, co pozwala uniknac bledow inicjalizacji. Ta funkcja pomaga zapobiegać przypadkowym pominięciom, zapewniając jednocześnie elastyczność w inicjalizacji właściwości.

Dlaczego wymagane właściwości są przydatne

Tim wyjasnia, ze nowe slowo kluczowe required upraszcza proces upewniania sie, ze wlasciwosci sa zawsze ustawione. Zamiast potrzebować konstruktorów dla metody set w każdym przypadku lub ryzykować niezdefiniowane właściwości, mamy teraz prosty sposób na wymaganie konkretnych wartości bezpośrednio w deklaracji właściwości.

Ta funkcja sprawdza się w modelach danych, w których niektóre pola są obowiązkowe, i może pomóc w wykryciu problemów na wczesnym etapie procesu programowania poprzez zapobieganie błędom null w czasie wykonywania.

Przykład dodatkowych właściwości

Nastepnie Tim dodal opcjonalna wlasciwosc Email, ktora moze byc null:

public string? Email { get; set; }
public string? Email { get; set; }

Poniewaz nie jest oznaczona required, wlasciwosc Email moze pozostac nieustawiona bez wywolania bledu kompilatora. Na tym przykładzie Tim zademonstrował elastyczność, jaką zapewnia klasa z wyraźnym rozróżnieniem między polami danych niezbędnymi a opcjonalnymi.

Wnioski

Dodanie wymaganych właściwości w C# 11 jest cenną funkcją dla programistów, zapewniającą, że niezbędne właściwości są zawsze inicjowane. Film Tima Coreya stanowi doskonałe wprowadzenie do tej funkcji i pokazuje, jak działa ona w aplikacji konsolowej. Laczac slowo kluczowe required z inicjatorami obiektow i konstruktorami, mozemy tworzyc bardziej solidne i bezpieczne modele danych w C#. Aby uzyskać więcej przydatnych samouczków, odwiedź kanał Tima na YouTube.

Hero Worlddot related to Zrozumienie właściwości w C#
Hero Affiliate related to Zrozumienie właściwości w C#

Zarabiaj więcej, dzieląc się tym, co kochasz

Tworzysz treści dla deweloperów pracujących z .NET, C#, Java, Python, czy Node.js? Zamień swoją wiedzę specjalistyczną na dodatkowy dochód!

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie