Sytuacja kobiet w IT w 2024 roku
29.11.20214 min
Juan Alberto España Garcia

Juan Alberto España GarciaFounder and CEOByteHide

Poznaj 6 przydatnych funkcji C# 10

Sprawdź, co się dzieje ze stałymi ciągami interpolowanymi, globalnymi dyrektywami using, czy zapieczętowaniem rekordów ToString.

Poznaj 6 przydatnych funkcji C# 10

C# 10 miał premierę 08.11.2021 r., sprawdź, jakie ulepszenia wprowadzono. Funkcje i usprawnienia, które Microsoft zamierza wprowadzić w kolejnej wersji C# 10 są następujące ?

Rekordy mogą mieć zapieczętowane ToString

Teraz w wersji C# 10.0 mamy możliwość dodania modyfikatora sealed, gdy nadpisujemy ToString w rekordzie.


Zapieczętowanie metody ToString pozwala uniknąć kompilatorowi syntezy metody ToString dla wszelkich typów pochodnych. Funkcja ta pozwala na zapewnienie, że wszystkie pochodne typy używają metody ToString zdefiniowanej we wspólnym typie rekordu podstawowego.

Czym jest rekord  <LangVersion> w pliku csproj na preview? 

Jeśli nie wiesz, o czym mówię, to jest on zwykle używany do definiowania typu referencyjnego, który opakowuje dane.

Prostym przykładem tego, co można z tym zrobić jest tworzenie typów rekordów z niemutowalnymi właściwościami przy pomocy standardowej składni ?

public record Person(string FirstName, string LastName);


Nie ma lepszego sposobu, aby to zrozumieć niż prosty przykład od Microsoftu ?

public record Person
{
  public string FirstName { get; init; }
  public string LastName { get; init; }
};

Deklaracja przestrzeni nazw na poziomie pliku

Możesz teraz użyć nowej formy deklaracji namespace, aby sprawić, że wszystkie kolejne deklaracje należą do tej przestrzeni nazwu ?

namespace NamespaceName;


Ta nowa składnia, która zostanie zaimplementowana w nowej wersji C# 10, pozwoli zaoszczędzić sporo miejsca, zarówno w pionie i w poziomie, szczególnie dla najbardziej typowych przestrzeni nazw.

Czym jest owy namespace? 

Wyjaśnijmy to, namespace jest używane do zadeklarowania zakresu, który zawiera zestaw powiązanych obiektów. Możesz użyć przestrzeni nazw do uporządkowania elementów kodu oraz do stworzenia globalnie unikalnych typów.

namespace SampleNamespace
{
  class SampleClass { }
  interface ISampleInterface { }
  struct SampleStruct { }
  enum SampleEnum { a, b }
  delegate void SampleDelegate(int i);
  namespace Nested
  { 
    class SampleClass2 { }
  } 
}


Pewnie, ale...

Czym są deklaracje przestrzeni nazw na poziomie pliku? 

Deklaracje te sprawiają, że wszystkie typy z pliku będą należeć do tej samej przestrzeni nazw.

Aby bardziej się w to zagłębić, w wersji C# 10.0, przykład jest podobny do poprzedniego, który został pokazany przez Microsoft, ale używa deklaracji przestrzeni nazw na poziomie pliku ?

using System;
namespace SampleFileScopedNamespace;
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);

Ciągi interpolowane jako stałe

Aby zrozumieć, o co chodzi w tej funkcji, najpierw musimy zrozumieć interpolację ciągów.

Znak $ identyfikuje literał łańcuchowy jako ciąg interpolowany. Ciąg interpolowany to literał łańcuchowy, który może zawierać wyrażenia interpolacji.

Gdy ciąg interpolowany jest zamieniany na ciąg wynikowy, elementy z wyrażeniami interpolacji są zastępowane reprezentacjami ciągów wyników wyrażenia.

Doskonale, teraz moje pytanie brzmi....

Co ciągi interpolowane i stałe mają wspólnego z C# 10? 

Nowością, którą przyniesie C# w wersji 10.0 są ciągi const, które mogą być inicjalizowane z użyciem interpolacji ciągów znaków, ale tylko wtedy, gdy same placeholdery również będą stałymi ciągami znaków.

Może to pozwolić na stworzenie bardziej czytelnych ciągów znaków będących stałymi, które nie mogą być stałymi liczbowymi, ponieważ te stałe są konwertowane na ciągi znaków czasie wykonywania. Bieżąca kultura (ustawienia regionalne) może mieć wpływ na ich reprezentację ciągu znaków.

Rozszerzone wzorce właściwości

Po pierwsze, wyjaśnię, o co w ogóle chodzi. Wzorce te pozwalają na to, aby podwzorce właściwości odnosiły się do zagnieżdżonych pól, na przykład:

if (e is MethodCallExpression { Method.Name: "MethodName" })


Zamiast:

if (e is MethodCallExpression { Method: { Name: "MethodName" } })


Teraz gdy zostało to wyjaśnione, zapytam ponownie....

Co rozszerzone wzorce właściwości mają wspólnego z C# 10? 

Kolejną funkcją, którą omawia Microsoft jest możliwość odwoływania się do zagnieżdżonych pól lub właściwości w ramach wzorca właściwości. Przykład podany przez Microsoft to wzorzec w postaci ?

{ Prop1.Prop2: pattern }


Microsoft mówi nam, że będzie on obowiązywał w C# 10.0 i nowszych wersjach, a to jest odpowiednie do ?

{ Prop1: { Prop2: pattern } }


I to obowiązuje w C# w wersji 8.0 i wszystkich kolejnych wersjach

Deklaracja i przypisanie w tej samej dekonstrukcji

Ta nowa zmiana wprowadzona przez nową wersję, pozwala na usunięcie ograniczenia z wcześniejszych wersji języka C#. Przykład, który podaje nam Microsoft w tym przypadku to ?

...Wcześniej dekonstrukcja mogła przypisać wszystkie wartości do istniejących zmiennych lub zainicjować nowo zadeklarowane zmienne:

// Initialization:
(int x, int y) = point;

// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;


Ograniczenie to zostało zniesione w C# 10.0 ?

int x = 0; (x, int y) = point;

Globalne dyrektywy using

Możesz teraz użyć modyfikatora global do dowolnej dyrektywy using. Dzięki temu możesz powiedzieć kompilatorowi, że dyrektywa musi być zastosowana do wszystkich plików źródłowych w kompilacji.

Doskonale, ale jak poprzednio..

Co to jest dyrektywa using?

Dyrektywa ta pozwala na użycie typów zdefiniowanych w przestrzeni nazw bez konieczności podawania całej przestrzeni nazw tego typu.

Podsumowując, dyrektywa using importuje wszystkie typy z jednej przestrzeni nazw, jak pokazano w poniższym przykładzie ?

using System.Text;


Do dyrektywy using można zastosować dwa modyfikatory:

  • Modyfikator global ma taki sam efekt, jak dodanie tej samej dyrektywy using do każdego pliku źródłowego w twoim projekcie. Modyfikator ten został wprowadzony w C# 10.0.
  • Modyfikator static importuje pola static i typy zagnieżdżone z pojedynczego typu, zamiast importować wszystkie typy w przestrzeni nazw.


A jeśli teraz to czytasz, to znaczy, że należysz do 1% osób, które czytają artykuły DO KOŃCA. Powiedz mi ile kaw ☕ potrzebujesz dziennie, żeby programować? Jeśli zobaczę ich dużo ☕ nie będę się czuł samotny i trochę mnie uszczęśliwisz!!! ??

Oryginał tekstu w języku angielskim przeczytasz tutaj.

<p>Loading...</p>