{"id":30907,"date":"2022-09-21T13:36:38","date_gmt":"2022-09-21T11:36:38","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/c-11-sprawdz-co-nowego\/"},"modified":"2024-11-07T13:11:51","modified_gmt":"2024-11-07T12:11:51","slug":"c-11-sprawdz-co-nowego","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/c-11-sprawdz-co-nowego\/","title":{"rendered":"C# 11 \u2013 sprawd\u017a, co nowego!"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do:<\/p>\n    <ol>\n                    <li><a href=\"#Historia-C\">1.  Historia C#<\/a><\/li>\n                    <li><a href=\"#Najbli\u017csza-aktualizacja-\u2013-funkcje-Cu002du002dudost\u0119pnione-w-wersji-zapoznawczej\">2.  Najbli\u017csza aktualizacja \u2013 funkcje C# udost\u0119pnione w wersji zapoznawczej<\/a><\/li>\n                    <li><a href=\"#Generic-attributes\">3.  Generic attributes<\/a><\/li>\n                    <li><a href=\"#Generic-math-support\">4.  Generic math support<\/a><\/li>\n                    <li><a href=\"#Nowe-linie-w-interpolacjach-ci\u0105g\u00f3w-znak\u00f3w\">5.  Nowe linie w interpolacjach ci\u0105g\u00f3w znak\u00f3w<\/a><\/li>\n                    <li><a href=\"#List-patterns\">6.  List patterns<\/a><\/li>\n                    <li><a href=\"#Raw-string-literals\">7.  Raw string literals<\/a><\/li>\n                    <li><a href=\"#Required members\">8.  Required members<\/a><\/li>\n                    <li><a href=\"#Parametr-null-checking\">9.  Parametr null-checking <\/a><\/li>\n                    <li><a href=\"#Auto-default-struct\">10.  Auto-default struct<\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">11.  Podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Historia-C\">Historia C#<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stycze\u0144 2002 \u2013 C# 1.0<\/li>\n\n\n\n<li>Listopad 2005 \u2013 C# 2.0<\/li>\n\n\n\n<li>Listopad 2007 \u2013 C# 3.0 (.NET Framework 3.0 i 3.5)<\/li>\n\n\n\n<li>Listopad 2007 \u2013 C# 4.0<\/li>\n\n\n\n<li>Sierpie\u0144 2012 \u2013 C# 5.0<\/li>\n\n\n\n<li>Lipiec 2015 \u2013 C# 6.0<\/li>\n\n\n\n<li>Marzec 2017 \u2013 C# 7.0 (.NET Framework 4.0)<\/li>\n\n\n\n<li>Wrzesie\u0144 2019 \u2013 C# 8.0<\/li>\n\n\n\n<li>Listopad 2020 \u2013 C# 9.0 (.NET Framework 5)<\/li>\n\n\n\n<li>Listopad 2021 \u2013 C# 10.0<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"756\" height=\"220\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_1-68.png\" alt=\"\" class=\"wp-image-32353\" style=\"width:750px;height:200px\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_1-68.png 756w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_1-68-300x87.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_1-68-495x144.png 495w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Najbli\u017csza-aktualizacja-\u2013-funkcje-C--udost\u0119pnione-w-wersji-zapoznawczej\">Najbli\u017csza aktualizacja \u2013 funkcje C# udost\u0119pnione w wersji zapoznawczej<\/h2>\n\n\n\n<p>Wydaje si\u0119, \u017ce nie tak dawno witali\u015bmy .NET 6 i C# 10, a ju\u017c niebawem, w listopadzie 2022 roku, pojawi si\u0119 kolejna aktualizacja. Jeste\u015b ciekaw, jakie nowe funkcje przyniesie najnowsza wersja C#? Ka\u017cdy programista mo\u017ce przekona\u0107 si\u0119 sam za pomoc\u0105 <strong>Visual Studio 2022 w wersji 17.3 <\/strong>(niekt\u00f3re z nowych funkcji s\u0105 dost\u0119pne we wcze\u015bniejszych wersjach VS \u2013 np. Visual Studio 17.1). Nowo\u015bci mo\u017cna r\u00f3wnie\u017c zobaczy\u0107 w aplikacji .NET 7 SDK w wersji zapoznawczej (do pobrania na platform\u0119 .NET).<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"756\" height=\"198\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_2-69.png\" alt=\"\" class=\"wp-image-32356\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_2-69.png 756w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_2-69-300x79.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2022\/09\/nearshore_2023.03.xx_graphic_2-69-495x130.png 495w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>&nbsp;&nbsp;Visual Studio 2022&nbsp;\u2013&nbsp;features for preview<\/strong><\/p>\n\n\n\n<p>&nbsp;&nbsp;17.3<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#generic-math-support\" target=\"_blank\" rel=\"noreferrer noopener\">Generic math support<\/a><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#auto-default-struct\" target=\"_blank\" rel=\"noreferrer noopener\">auto-default structs<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#pattern-match-spanchar-or-readonlyspanchar-on-a-constant-string\" target=\"_blank\" rel=\"noreferrer noopener\">Pattern match Span&lt;char&gt; on a constant string<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#extended-nameof-scope\" target=\"_blank\" rel=\"noreferrer noopener\">Extended nameof scope<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#numeric-intptr-and-uintptr\" target=\"_blank\" rel=\"noreferrer noopener\">Numeric IntPtr<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#utf-8-string-literals\" target=\"_blank\" rel=\"noreferrer noopener\">UTF-8 string literals<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#required-members\" target=\"_blank\" rel=\"noreferrer noopener\">Required members<\/a><\/li>\n<\/ul>\n\n\n\n<p>&nbsp;&nbsp;17.2<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#raw-string-literals\" target=\"_blank\" rel=\"noreferrer noopener\">Raw string literals<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#improved-method-group-conversion-to-delegate\" target=\"_blank\" rel=\"noreferrer noopener\">Improved method group conversion to delegate<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/compiler-messages\/warning-waves#cs8981---the-type-name-only-contains-lower-cased-ascii-characters\" target=\"_blank\" rel=\"noreferrer noopener\">Warning wave 7<\/a><\/li>\n<\/ul>\n\n\n\n<p>&nbsp;&nbsp;17.1<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#generic-attributes\" target=\"_blank\" rel=\"noreferrer noopener\">Generic attributes<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#newlines-in-string-interpolations\" target=\"_blank\" rel=\"noreferrer noopener\">Newlines in string interpolation expressions<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11#list-patterns\" target=\"_blank\" rel=\"noreferrer noopener\">List patterns<\/a><\/li>\n<\/ul>\n\n\n\n<p><em>Source:&nbsp;<\/em><a target=\"_blank\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11\" rel=\"noreferrer noopener\"><em>Microsoft<\/em><\/a><\/p>\n\n\n\n<p>Poni\u017cej znajdziesz przegl\u0105d, moim zdaniem, najciekawszych z nich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Generic-attributes\">Generic attributes<\/h2>\n\n\n\n<p>Wersja C# 11 zosta\u0142a wyposa\u017cona w funkcjonalno\u015b\u0107 <strong>generic attributes.<\/strong> Pozwala ona utworzy\u0107 klas\u0119 og\u00f3ln\u0105 wywodz\u0105c\u0105 si\u0119 z klasy <strong><em>System.Attribute<\/em>, <\/strong>kt\u00f3ra u\u0142atwia tworzenie atrybut\u00f3w wymagaj\u0105cych parametru <strong>System.Type. <\/strong>We wcze\u015bniejszych wersjach C# programista musia\u0142 tworzy\u0107 bardziej z\u0142o\u017cone rozwi\u0105zania w zakresie atrybut\u00f3w z parametrem <strong>Type <\/strong>w konstruktorze. Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class TypeAttribute : Attribute\n{\npublic TypeAttribute (Type t) => ParamType = t;\n\npublic Type ParamType {get; }\n}\n[TypeAttribute(typeof(string))]\npublic  string Method () => default;\n\n<\/pre>\n\n\n\n<p>W przypadku C# 11 mo\u017cna to osi\u0105gn\u0105\u0107 w prostszy spos\u00f3b:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class GenericAttribute : Attribute { }\n[GenericAttribute ()]\npublic string Method () => default;<\/pre>\n\n\n\n<p>Usuni\u0119cie obowi\u0105zkowego u\u017cycia<strong> <em>typeof(\u2026)<\/em><\/strong> w atrybutach i zast\u0105pienie go typami rodzajowymi eliminuje problem zwi\u0105zany z zapewnieniem, \u017ce typ wewn\u0105trz <strong>typeof()<\/strong> b\u0119dzie spe\u0142nia\u0107 wymogi atrybut\u00f3w. Ta funkcja mia\u0142a si\u0119 ukaza\u0107 we wcze\u015bniejszych wersjach C#, ale ze wzgl\u0119du na niezgodno\u015b\u0107 z narz\u0119dziami deweloperskimi Microsoft zdecydowa\u0142 si\u0119 prze\u0142o\u017cy\u0107 dat\u0119 jej premiery. Teraz jednak nadszed\u0142 jej czas!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Generic-math-support\">Generic math support<\/h2>\n\n\n\n<p>Pod t\u0105 nazw\u0105 kryje si\u0119 kilka nowych funkcji, kt\u00f3re razem sk\u0142adaj\u0105 si\u0119 na generic math support. S\u0105 to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>static virtual oraz static abstract members in interfaces<\/li>\n\n\n\n<li>checked user defined operators<\/li>\n\n\n\n<li>relaxed shift operators<\/li>\n\n\n\n<li>unsigned right-shift operator<\/li>\n<\/ul>\n\n\n\n<p>Ta funkcja pozwala programistom u\u017cywa\u0107 statycznych interfejs\u00f3w API z kodu og\u00f3lnego. Pozwala np. w jednej implementacji wdro\u017cy\u0107 kalkulator sumy lub \u015bredniej dla r\u00f3\u017cnych typ\u00f3w liczb. Wi\u0119cej szczeg\u00f3\u0142\u00f3w na temat nowej sk\u0142adni znajdziesz w <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/keywords\/interface#static-abstract-and-virtual-members\" target=\"_blank\" rel=\"noopener\">dokumentacji C#<\/a>. Typy numeryczne implementuj\u0105 nowy interfejs INumber, kt\u00f3ry zawiera w\u0142a\u015bciwo\u015bci <strong>T.One<\/strong> i <strong>T.Zero<\/strong>. Mo\u017cna to wykorzysta\u0107 do implementacji kalkulator\u00f3w sumy og\u00f3lnej lub \u015bredniej dla wielu typ\u00f3w liczb, zachowuj\u0105c zasad\u0119 DRY. Metoda ta mo\u017ce by\u0107 r\u00f3wnie\u017c zaimplementowana jako operator +.<\/p>\n\n\n\n<p>Mo\u017cna go znale\u017a\u0107 w nast\u0119puj\u0105cym listingu:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">T Sum&lt; T >(T[] values) where T : INumber&lt;T>\n{\nT result = T.Zero;\nforeach (var value in values)\n   {\n result += value;\n   }\nreturn result;\n}\n \nT Sum&lt; T >(T[] values) where T : INumber&lt;T>\n{\nvar sum = Sum(values);\nvar count = T.Zero;\nfor (var i = 0; i &lt; values.Length; i++)\n   {\ncount += T.One;\n   }\nreturn sum \/ count;\n}\nvar  ints = new [] {1, 2, 3, 4, 5};\nvar  doubles = new [] { 0.1, 0.7, 1.1, 8.3 };\n \nvar  sumOfInts = Sum(ints);\nvar  avgOfInts = Avg(ints);\nvar  sumOfDoubles = Sum(doubles);\nvar  avgOfDoubles = Avg(doubles);\n<\/pre>\n\n\n\n<p>Funkcja generic math support wp\u0142yn\u0119\u0142a na inne aspekty w C# 11:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>operator right-shift<\/strong> \u2013 za pomoc\u0105 operatora <strong>&gt; &gt; &gt;<\/strong> mo\u017cna wymusi\u0107 dowolne przesuni\u0119cia w prawo do nieprzypisanych operator\u00f3w right-shift, co oznacza, \u017ce pozycje pustych bit\u00f3w wysokiego rz\u0119du s\u0105 zawsze ustawione na zero, niezale\u017cnie od typu argumentu&nbsp;po lewej stronie.<\/li>\n\n\n\n<li><strong>relaxed shift operator<\/strong> \u2013 pocz\u0105wszy od wersji C# 11, drugi argument miany nie musi by\u0107 argumentem <em>int <\/em>lub domy\u015blnie konwertowalnym do <em>int<\/em>, co pozwala na u\u017cycie tego operatora w og\u00f3lnych interfejsach matematycznych<\/li>\n\n\n\n<li><strong>zaznaczone (i niezaznaczone) zdefiniowane operatory<\/strong> \u2013 mo\u017cna zdefiniowa\u0107 arytmetyczne operatory. Kompilator generuje wywo\u0142ania do w\u0142a\u015bciwego wariantu w oparciu o bie\u017c\u0105cy kontekst  <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Nowe-linie-w-interpolacjach-ci\u0105g\u00f3w-znak\u00f3w\">Nowe linie w interpolacjach ci\u0105g\u00f3w znak\u00f3w<\/h2>\n\n\n\n<p>Ta funkcja po raz pierwszy pojawi\u0142a si\u0119 w C# 6 wraz z Visual Studio 2015. Zast\u0119puje ona String.Format(). Format interpolacji ci\u0105g\u00f3w znak\u00f3w jest ci\u0105giem wewn\u0105trz cudzys\u0142ow\u00f3w podw\u00f3jnych, poprzedzonych $. Wewn\u0105trz tego ci\u0105gu mo\u017cna okre\u015bli\u0107 parametry lub wykonanie metody w nawiasach <strong>{}.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$\"{&lt;interpolationExpression>[,&lt;alignment>][:&lt;formatString>]} other text in string\u201d<\/pre>\n\n\n\n<p>Wraz z C# 11 funkcja zyskuje niewielk\u0105 aktualizacj\u0119, kt\u00f3ra pozwoli zawiera\u0107 nowe linie wewn\u0105trz formu\u0142. Wcze\u015bniej niekt\u00f3re d\u0142ugie formu\u0142y zawieraj\u0105ce zapytania LINQ mog\u0142y by\u0107 nieczytelne. Ju\u017c tak nie b\u0119dzie. Wraz z kolejnym wydaniem C# b\u0119dziemy mogli u\u017cywa\u0107 nowych linii, a tym samym \u2013 skomplikowane formu\u0142y b\u0119d\u0105 wygl\u0105da\u0107 o niebo lepiej.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var  list = new [] {\"Apple\", \"Banana\", \"Orange\", \"Grapefruit\"};\nvar  str = $\"Third letters of fruits starts with B: {list\n   .Gdzie(fruit => fruit.StartsWith(\"B\"))\n   .Select(fruit => fruit[2])\n   .FirstOrDefault()} \";\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"List-patterns\">List patterns<\/h2>\n\n\n\n<p><strong>Dopasowanie wzorca<\/strong> \u2013 dopasowanie obiektu do typu w przypadku instrukcji wielokrotnego wyboru, ale nie tylko. Wi\u0119cej informacji na temat dopasowywania wzorc\u00f3w mo\u017cna znale\u017a\u0107 w <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/fundamentals\/functional\/pattern-matching\" target=\"_blank\" rel=\"noopener\">dokumentacji Microsoft<\/a>. Dopasowanie wzorca zosta\u0142o wprowadzone w C# 7 ze s\u0142owem kluczowym <em>is<\/em> pozwalaj\u0105cym zmapowa\u0107 obiekt do typu i <em>when<\/em> \u2013 s\u0142owem kluczowym do u\u017cycia w instrukcjach wielokrotnego wyboru.<\/p>\n\n\n\n<p>Nast\u0119pnie C# 7.1 rozwin\u0105\u0142 wzorce typ\u00f3w do obs\u0142ugi typ\u00f3w og\u00f3lnych. C# 8 ulepszy\u0142 dopasowywanie wzorc\u00f3w, dodaj\u0105c wzorce w\u0142a\u015bciwo\u015bci pozwalaj\u0105ce dobra\u0107 typ i w\u0142a\u015bciwo\u015b\u0107. Kolejne wydanie C# przynios\u0142o wzorce relacyjne. Zatem od wersji C# 9 mo\u017cemy u\u017cy\u0107 <strong>&gt;<\/strong>, <strong>&lt;<\/strong>, <strong>&gt;=<\/strong>, <strong>&lt;=<\/strong> w dopasowywaniu w\u0142a\u015bciwo\u015bci. C# 9 umo\u017cliwi\u0142 u\u017cycie operator\u00f3w logicznych <strong><em>and<\/em>, <em>or<\/em>, <em>not, is null, is not null<\/em> <\/strong>w dopasowaniu wzorca i <em>var<\/em> \u2013 s\u0142owa kluczowego do tworzenia zmiennych. C# 10 rozszerzy\u0142 jeszcze wzorce w\u0142asno\u015bci&#8230; a teraz kolej na mo\u017cliwo\u015bci, jakie oferuje C# 11.<\/p>\n\n\n\n<p><strong>Wzorce listy <\/strong>\u2013 dopasowanie sekwencji element\u00f3w. List\u0119 mo\u017cna dopasowa\u0107, u\u017cywaj\u0105c niekt\u00f3rych element\u00f3w jako wzorca. Discard pattern <strong>(<em>_<\/em>)<\/strong> s\u0142u\u017cy do dopasowania dowolnych pojedynczych element\u00f3w, a wzorzec zakresu<strong> (<em>..<\/em>)<\/strong> \u2013 do dopasowania dowolnej sekwencji zerowych lub wi\u0119kszej liczby element\u00f3w.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var  list = new [] {\nnew [] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},\/\/ A\nnew [] {1, 2, 3, 5, 7, 10},\/\/ B\nnew [] {0, 2, 3, 8, 10, 10},\/\/ C\nnew [] {3, 4, 10},\/\/ D\nnowe [] {1, 4, 10, 15, 21, 3, 10},\/\/ E\nnowe [] {-1, 2, 3, 5, -1, 10}\/\/ F\n};\n\n\u2022\tMatch complete list:\n list.Where(x => x is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\/\/ matches list A\n\u2022\tMatch some elements:\n list.Where(x => x is [_, 2, 3,_,_, 10]);\/\/ matches lists B, C, F\n\u2022\tMatch range:\n list.Where(x => x is [1, 2, .., 10]);\/\/ matches lists A, B\n\u2022\tMixed match for elements and range:\n list.Where(x => x is [1,_, .., 10]);\/\/ matches lists A, B, E\n\u2022\tMatch list starting with negative number:\n list.Where(x => x is [&lt; 0, ..]);\/\/ matches list F\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Raw-string-literals\">Raw string literals<\/h2>\n\n\n\n<p>Nieprzetworzone litera\u0142y ci\u0105g\u00f3w mog\u0105 by\u0107 wielowierszowe, zawiera\u0107 cudzys\u0142owy i inne znaki specjalne bez sekwencji ucieczki (escape) oraz interpolacje ci\u0105g\u00f3w. Oto kilka przyk\u0142ad\u00f3w:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var  line2 = \"line2 from another variable\";\n \nvar  str1 = \"\"\nline1\n{line2} - won't be replaced\nline3\nline4 \n       \nline6\n\"\";\n \nvar  str2 = $\"\"\nline1 from second string\n{line2}\nline3\n\"\";\n \nvar  str3 = $$\"\"\nusing { in line 1}\n{{line2}}\n{line2} this won't be replaced\n{{{line2}}} you can use it like this\n\"\" ;\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Required-members\">Required members<\/h2>\n\n\n\n<p>Developerzy zyskuj\u0105 mo\u017cliwo\u015b\u0107 oznaczania w\u0142a\u015bciwo\u015bci i p\u00f3l z u\u017cyciem modyfikatora <strong><em>required<\/em>.<\/strong> Pozwala to upewni\u0107 si\u0119, \u017ce dane warto\u015bci s\u0105 inicjowane w konstruktorze. Nast\u0119pnie nale\u017cy ustawi\u0107 atrybut <strong><em>SetsRequiredMembers<\/em> <\/strong>na konstruktor, kt\u00f3ry powinien zainicjowa\u0107 warto\u015bci. Mo\u017cesz mie\u0107 konstruktory bez atrybutu, nie musz\u0105 inicjowa\u0107 one wymaganych warto\u015bci.<\/p>\n\n\n\n<p>Wymagane elementy musz\u0105 by\u0107 zainicjowane, ale mo\u017cna je zainicjowa\u0107 do warto\u015bci null. W przypadku typu referencyjnego niedopuszczaj\u0105cego warto\u015bci null kompilator wysy\u0142a ostrze\u017cenie, je\u015bli zainicjujesz element do tej warto\u015bci. Je\u015bli element (member) nie jest w og\u00f3le zainicjowany, kompilator wystawia b\u0142\u0105d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Parametr-null-checking\">Parametr null-checking \u2013 od\u0142o\u017cony po wersji zapoznawczej<\/h2>\n\n\n\n<p>W C# 11 planowano doda\u0107 funkcj\u0119 sprawdzania parametru null, ale zosta\u0142a ona na razie od\u0142o\u017cona ze wzgl\u0119du na zastrze\u017cenia developer\u00f3w <a href=\"https:\/\/github.com\/dotnet\/csharplang\/blob\/main\/meetings\/2022\/LDM-2022-04-06.md#parameter-null-checking\" target=\"_blank\" rel=\"noopener\">na Spotkaniu C# Language Design, kt\u00f3re odby\u0142o si\u0119 6 kwietnia 2022 r.<\/a> Funkcja zosta\u0142a udost\u0119pniona do wgl\u0105du i szeroko om\u00f3wiona. Podczas gdy wielu developer\u00f3w by\u0142o zadowolonych, inni mieli wszelkiego rodzaju zastrze\u017cenia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Auto-default-struct\">Auto-default struct<\/h2>\n\n\n\n<p>Przed wydaniem C# 11 programi\u015bci musieli tworzy\u0107 konstruktory strukturalne o parametrach zapewniaj\u0105cych inicjowanie wszystkich p\u00f3l. C# 11 sprawi, \u017ce b\u0119dzie inaczej. Na razie mo\u017cna utworzy\u0107 struktur\u0119 z konstruktorem bez parametr\u00f3w, kt\u00f3ry nie inicjuje od razu element\u00f3w struktury. Nast\u0119pnie zadaniem kompilatora jest sprawi\u0107, by wszystkie jeszcze niezainicjowane pola zosta\u0142y zainicjowane do ich warto\u015bci domy\u015blnej. Kompilator dodaje niezb\u0119dny kod na pocz\u0105tku body konstruktora, przed uzyskaniem dost\u0119pu do p\u00f3l. Je\u015bli jest to mo\u017cliwe przed zainicjowaniem wszystkich p\u00f3l, struktura zostanie zainicjowana do warto\u015bci domy\u015blnej przed wykonaniem korpusu konstruktora.<\/p>\n\n\n\n<p>Wi\u0119cej o inicjowaniu struktury i warto\u015bciach domy\u015blnych w <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/builtin-types\/struct#struct-initialization-and-default-values\" target=\"_blank\" rel=\"noopener\">C# mo\u017cna przeczyta\u0107 na stronie dokumentacji Microsoft<\/a>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public  readonly struct AutoDefaultStruct\n{\npublic int IntegerValue {get; }\npublic string StringValue {get; }\npublic double DoubleValue {get; }\n\npublic AutoDefaultStruct ()\n    {\n\/\/IntegerValue = default;\n\/\/StringValue = default;\n\/\/DoubleValue = default;\n\/\/ nie musi ustawia\u0107 warto\u015bci dla wszystkich p\u00f3l, domy\u015blne inicjalizacje zostan\u0105 dodane na pocz\u0105tku konstruktora przez kompilator\n    }\n}\n\nvar structDemo = new AutoDefaultStruct(); \n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie\">Podsumowanie: programisto, przygotuj si\u0119 na wi\u0119cej funkcji C# 11!<\/h2>\n\n\n\n<p>Powy\u017cej opisa\u0142em najwa\u017cniejsze funkcje C# 11, kt\u00f3re mo\u017cna nawet dzi\u015b sprawdzi\u0107 w wersji zapoznawczej. <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-11\" target=\"_blank\" rel=\"noopener\">Pe\u0142na lista zmian<\/a> jest rzecz jasna znacznie d\u0142u\u017csza i obejmuje: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rozszerzony zakres <strong>nameof <\/strong><\/li>\n\n\n\n<li>Dopasowanie wzorca dla <strong>Span&lt;char&gt; <\/strong>i <strong>ReadOnlySpan&lt;char&gt; <\/strong><\/li>\n\n\n\n<li>Aliasy dla <strong>IntPtr i UIntPtr<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Oraz wiele wi\u0119cej! Dokumentacj\u0119 techniczn\u0105 mo\u017cesz znale\u017a\u0107 <a href=\"https:\/\/github.com\/dotnet\/csharplang\/blob\/main\/meetings\/2021\/LDM-2021-08-30.md\" target=\"_blank\" rel=\"noopener\">w serwisie GitHub.<\/a><\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce te artyku\u0142y:<br><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/extreme-programming-xp\/\">Extreme Programming<\/a><br><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it\/\">Mikroserwisy \u2013 nowy standard?<\/a><\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Co roku pojawia si\u0119 nowa wersja j\u0119zyka programowania C#. Wersja C# 11 ujrzy \u015bwiat\u0142o dzienne w listopadzie 2022 roku wraz z .NET 7. W tym artykule przyjrz\u0119 si\u0119 wybranym wa\u017cnym funkcjonalno\u015bciom C# 11. Czekasz na t\u0119 aktualizacj\u0119 i zastanawiasz si\u0119, co nowego si\u0119 pojawi? Zapoznaj si\u0119 z moim miniprzewodnikiem i sprawd\u017a, czy nowe funkcje s\u0105 warte uwagi i w jaki spos\u00f3b mog\u0105 usprawni\u0107 prac\u0119 programist\u00f3w.<\/p>\n","protected":false},"author":112,"featured_media":30915,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":45,"footnotes":""},"categories":[1,582],"tags":[],"offering":[522],"class_list":["post-30907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/112"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=30907"}],"version-history":[{"count":4,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30907\/revisions"}],"predecessor-version":[{"id":33824,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/30907\/revisions\/33824"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/30915"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=30907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=30907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=30907"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=30907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}