{"id":546,"date":"2024-04-06T01:24:21","date_gmt":"2024-04-05T22:24:21","guid":{"rendered":"https:\/\/blog.keremgumus.com\/?p=546"},"modified":"2024-04-06T01:29:08","modified_gmt":"2024-04-05T22:29:08","slug":"net-core-c-12-ve-net-core-8deki-bazi-yeni-ozellikler","status":"publish","type":"post","link":"https:\/\/blog.keremgumus.com\/index.php\/2024\/04\/06\/net-core-c-12-ve-net-core-8deki-bazi-yeni-ozellikler\/","title":{"rendered":"NET Core: C# 12 ve .NET Core 8&#8217;deki Baz\u0131 Yeni \u00d6zellikler"},"content":{"rendered":"\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a href=\"#aioseo-net8-sdk\">.NET8 SDK<\/a><\/li><li><a href=\"#aioseo-1-primary-constructors\">1.Primary Constructors<\/a><\/li><li><a href=\"#aioseo-2-collection-expressions\">2.Collection Expressions<\/a><\/li><li><a href=\"#aioseo-3-default-lambda-parameters\">3.Default Lambda Parameters<\/a><\/li><li><a href=\"#aioseo-4-alias-any-type\">4.Alias Any Type<\/a><\/li><li><a href=\"#aioseo-5-experimental-attribute\">5.Experimental Attribute<\/a><\/li><li><a href=\"#aioseo-6-inline-arrays\">6.Inline Arrays<\/a><\/li><li><a href=\"#aioseo-7-raw-string-literals\">7.Raw String Literals<\/a><\/li><\/ul><\/div>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile is-style-rounded\"><figure class=\"wp-block-media-text__media\"><img fetchpriority=\"high\" decoding=\"async\" width=\"720\" height=\"560\" src=\"http:\/\/blog.keremgumus.com\/wp-content\/uploads\/Yaz\u0131l\u0131m\/.NET_CORE_YENI_OZELLIK\/netCore8.webp\" alt=\"\" class=\"wp-image-551 size-full\" srcset=\"https:\/\/blog.keremgumus.com\/wp-content\/uploads\/Yaz\u0131l\u0131m\/.NET_CORE_YENI_OZELLIK\/netCore8.webp 720w, https:\/\/blog.keremgumus.com\/wp-content\/uploads\/Yaz\u0131l\u0131m\/.NET_CORE_YENI_OZELLIK\/netCore8-300x233.webp 300w, https:\/\/blog.keremgumus.com\/wp-content\/uploads\/Yaz\u0131l\u0131m\/.NET_CORE_YENI_OZELLIK\/netCore8-15x12.webp 15w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p>.NET 8 ve C# Kas\u0131m 2023 s\u00fcr\u00fcm\u00fc, .NET d\u00fcnyas\u0131nda sadece bir s\u00fcr\u00fcm y\u00fckseltmesi de\u011fil, ayn\u0131 zamanda ASP.NET Core proje geli\u015ftirmenin gelece\u011fini \u015fekillendirecek yeniliklerle dolu bir d\u00f6n\u00fcm noktas\u0131d\u0131r. Yeni s\u00fcr\u00fcm, performans iyile\u015ftirmelerinden kod yazma pratiklerine, verimlili\u011fi art\u0131ran \u00f6zelliklerden geli\u015ftirici deneyimini zenginle\u015ftiren ara\u00e7lara kadar bir s\u00fcr\u00fc yenilik getiriyor.<\/p>\n<\/div><\/div>\n\n\n\n<p>Makalede Primary Constructors, Collection Expressions, Default Lambda Parameters gibi dikkat \u00e7ekici \u00f6zelliklerin yan\u0131 s\u0131ra, daha \u00f6zel alanlarda kullan\u0131labilecek Inline Arrays ve deneysel \u00e7al\u0131\u015fmalar i\u00e7in kullanabilece\u011fimiz Experimental Attribute gibi ileri seviye konseptlere de de\u011finece\u011fiz. Ayr\u0131ca, C# 11&#8217;den itibaren kullan\u0131ma sunulan ancak .NET 8 ile daha geni\u015f bir kitleye ula\u015fmas\u0131 beklenen Raw String Literals gibi \u00f6zelliklerin pratik kullan\u0131mlar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-net8-sdk\">.NET8 SDK<\/h4>\n\n\n\n<p><a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\/dotnet\/8.0?source=post_page-----d4e76c113662--------------------------------\" target=\"_blank\" rel=\"noopener nofollow\" title=\".Net8 SDK Resmi Web Sayfas\u0131 Ve \u00d6zelikleri \u0130ncelemek i\u00e7in T\u0131klay\u0131n\u0131z.\">.Net8 SDK Resmi Web Sayfas\u0131 Ve \u00d6zelikleri \u0130ncelemek i\u00e7in T\u0131klay\u0131n\u0131z.<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-1-primary-constructors\">1.Primary Constructors<\/h4>\n\n\n\n<p>C# 12 ile gelen Primary Constructors \u00f6zelli\u011fi, s\u0131n\u0131flar\u0131n daha sade ve temiz bir \u015fekilde tan\u0131mlanmas\u0131n\u0131 sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu yeni yap\u0131, \u00f6zellikle Dependency Injection kullanan ASP.NET Core projelerinde, constructor tan\u0131mlamalar\u0131n\u0131 daha verimli bir hale getirir.<\/p>\n\n\n\n<p>\u00d6rne\u011fin, bir UserService s\u0131n\u0131f\u0131n\u0131z varsa ve bu s\u0131n\u0131f IUserRepository ve ILogger gibi ba\u011f\u0131ml\u0131l\u0131klar\u0131 inject ediyor olacak. C# 12&#8217;den \u00f6nce, her bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 manuel olarak s\u0131n\u0131f i\u00e7inde private alanlara ataman\u0131z ve bir constructor i\u00e7inde bu atamalar\u0131 yapman\u0131z gerekirdi.<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>public class UserService : IUserService\n{\n    private readonly IUserRepository _userRepository;\n    private readonly ILogger _logger;\n\n    public UserService(IUserRepository userRepository, ILogger logger)\n    {\n        _userRepository = userRepository;\n        _logger = logger;\n    }\n}<\/em>\n<\/code><\/pre>\n\n\n\n<p>C# 12 ile birlikte, Primary Constructors \u00f6zelli\u011fi sayesinde, ayn\u0131 i\u015flemi tek sat\u0131rda ve s\u0131n\u0131f tan\u0131m\u0131 i\u00e7erisinde ger\u00e7ekle\u015ftirebilirsiniz. Bu, hem kod tekrar\u0131n\u0131 azalt\u0131r hem de constructor i\u00e7indeki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 daha okunabilir k\u0131lar.<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>public class UserService(IUserRepository userRepository, ILogger logger) : IUserService\n{\n    private readonly IUserRepository _userRepository = userRepository;\n    private readonly ILogger _logger = logger;\n}<\/em><\/code><\/pre>\n\n\n\n<p>Burada UserService s\u0131n\u0131f\u0131, IUserRepository ve ILogger t\u00fcr\u00fcndeki parametreleri do\u011frudan al\u0131r ve bu parametreler s\u0131n\u0131f i\u00e7indeki private alanlara atan\u0131r. Bu, daha \u00f6nce constructor i\u00e7inde yap\u0131lmas\u0131 gereken i\u015flemleri otomatikle\u015ftirir ve s\u0131n\u0131f\u0131n tan\u0131m\u0131n\u0131 sadele\u015ftirir. Bu sayede, kodun okunabilirli\u011fi artarken, ayn\u0131 zamanda tan\u0131mlama s\u0131ras\u0131nda hata yapma ihtimali de d\u00fc\u015fer.<\/p>\n\n\n\n<p>Primary Constructors, ASP.NET Core\u2019da s\u0131k\u00e7a kullan\u0131lan design pattern\u2019ler ile uyumlu \u015fekilde \u00e7al\u0131\u015f\u0131r ve geli\u015ftiricilere daha temiz bir kod taban\u0131 yaratma f\u0131rsat\u0131 verir. Bu yeni \u00f6zellik, \u00f6zellikle b\u00fcy\u00fck projelerde veya \u00e7ok say\u0131da ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n y\u00f6netildi\u011fi durumlarda, kodun anla\u015f\u0131labilirli\u011fini ve y\u00f6netilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-2-collection-expressions\">2.Collection Expressions<\/h4>\n\n\n\n<p>C# 12 ile tan\u0131t\u0131lan Collection Expressions, koleksiyonlar\u0131 initialize ve definition i\u015flemlerini daha k\u0131sa ve anla\u015f\u0131l\u0131r bir hale getirmek i\u00e7in kullan\u0131lan bir \u00f6zelliktir. Bu, \u00f6zellikle koleksiyonlar\u0131 s\u0131k\u00e7a kullan\u0131lan ve initializers ile koleksiyon nesnelerini doldurman\u0131n yayg\u0131n oldu\u011fu geli\u015ftirmede zaman kazand\u0131r\u0131r ve kodu daha okunakl\u0131 k\u0131lar.<\/p>\n\n\n\n<p>C# 12 \u00f6ncesinde koleksiyon initialize i\u015flemleri genellikle a\u015fa\u011f\u0131daki gibi yap\u0131l\u0131rd\u0131 \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code>List&lt;User&gt; users = new List&lt;User&gt;();\n\/\/ veya\nvar users = new List&lt;User&gt;();\n\/\/ veya\nList&lt;User&gt; user = new();<\/code><\/pre>\n\n\n\n<p>C# 12 ile gelen bu yeni \u00f6zellik sayesinde, ayn\u0131 i\u015flemi daha sade bir syntax ile yapabiliriz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>List&lt;User&gt; users = &#91;];\n<\/em><\/code><\/pre>\n\n\n\n<p>Bu yeni \u00f6zellik, collection initialize kullan\u0131rken s\u00fcsl\u00fc parantezlerin ({}) yerine k\u00f6\u015feli parantezleri ([]) kullanman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle koleksiyonu sabit de\u011ferlerle initialize ederken daha sade ve okunakl\u0131 bir kod yazman\u0131za olanak tan\u0131r.<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>List&lt;User&gt; users = \n&#91;\n    new User { Username = \"user1\" },\n    new User { Username = \"user2\" }\n];<\/em><\/code><\/pre>\n\n\n\n<p>Array initialize i\u00e7in de benzer bir iyile\u015ftirme yap\u0131lm\u0131\u015ft\u0131r. Art\u0131k dizileri ba\u015flatmak i\u00e7in new s\u00f6zc\u00fc\u011f\u00fcne ve tip belirtimine ihtiya\u00e7 duymazs\u0131n\u0131z \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><code><em>\/\/ C# 12 \u00f6ncesinde\nstring&#91;] statusCodes = new string&#91;] { \"SUCCESS\", \"WARNING\", \"DANGER\"};\n\n\/\/ C# 12 ile\nstring&#91;] statusCodes = &#91;\"SUCCESS\", \"WARNING\", \"DANGER\"];<\/em><\/code><\/code><\/pre>\n\n\n\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, C# 12&#8217;deki Collection Expressions \u00f6zelli\u011fi, koleksiyonlar\u0131 ve dizileri initialize i\u015flemini daha etkili hale getirir. Bu, kodun daha az ve daha anlaml\u0131 olmas\u0131n\u0131 sa\u011flar, b\u00f6ylece geli\u015ftiricilerin intentlerini daha net bir \u015fekilde ifade etmelerine olanak tan\u0131r. \u00d6zellikle sabit verilerle \u00e7al\u0131\u015f\u0131rken veya ba\u015flang\u0131\u00e7ta belli de\u011ferlere sahip koleksiyonlar olu\u015ftururken bu yeni \u00f6zellik olduk\u00e7a faydal\u0131d\u0131r.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-3-default-lambda-parameters\">3.Default Lambda Parameters<\/h4>\n\n\n\n<p>C# 12 ile geli\u015ftiricilere sunulan Default Lambda Parameters \u00f6zelli\u011fi, lambda ifadelerinde parametreler i\u00e7in varsay\u0131lan de\u011ferler tan\u0131mlama imk\u00e2n\u0131 getirir. Bu sayede, lambda ifadeleri daha esnek hale gelir ve baz\u0131 parametrelerin \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 yerde her defas\u0131nda belirtilmesine gerek kalmaz.<\/p>\n\n\n\n<p>Lambda ifadeleri, genellikle k\u0131sa ve \u00f6zg\u00fcn fonksiyonlar yazmak i\u00e7in kullan\u0131l\u0131r ve bu fonksiyonlar \u00e7e\u015fitli operasyonlar i\u00e7in delegate olarak g\u00f6rev alabilirler. Varsay\u0131lan lambda parametreleri \u00f6zelli\u011fi, fonksiyonlara daha fazla esneklik ve kullan\u0131m kolayl\u0131\u011f\u0131 sa\u011flayarak, kod tekrar\u0131n\u0131 azaltmaya ve ifadeleri daha anla\u015f\u0131l\u0131r k\u0131lmaya yard\u0131mc\u0131 olur.<\/p>\n\n\n\n<p>C# 12 \u00f6ncesinde lambda parametrelerinin her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 yerde a\u00e7\u0131k\u00e7a belirtilmesi gerekiyordu\ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em><code>var getFullName = (string firstName, string lastName) =&gt; string.Join(\" \", firstName, lastName);\nvar fullName1 = getFullName(\"Kerem\", \"\");\nvar fullName2 = getFullName(\"Kerem\", \"G\u00dcM\u00dc\u015e\");<\/code><\/em><\/code><\/pre>\n\n\n\n<p id=\"edb5\">Bu \u00f6rnekte,&nbsp;<strong>getFullName<\/strong>&nbsp;fonksiyonu iki parametre al\u0131r ve bunlar\u0131 birle\u015ftirerek tam ad\u0131 olu\u015fturur. E\u011fer bir soyad\u0131 sa\u011flanmazsa, bo\u015f bir string ge\u00e7mek zorunday\u0131z.<\/p>\n\n\n\n<p id=\"34b3\">C# 12 ile tan\u0131t\u0131lan varsay\u0131lan parametrelerle, lambda ifadesinde belirli bir parametrenin varsay\u0131lan bir de\u011fere sahip olmas\u0131n\u0131 sa\u011flayabiliriz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code>var getFullName = (string firstName, string lastName = \"\") =&gt; string.Join(\" \", firstName, lastName);\nvar fullName1 = getFullName(\"Kerem\"); \/\/ lastName parametresi iste\u011fe ba\u011fl\u0131\nvar fullName2 = getFullName(\"Kerem\", \"G\u00dcM\u00dc\u015e\");<\/code><\/pre>\n\n\n\n<p>Bu durumda, lastName parametresi i\u00e7in varsay\u0131lan bir de\u011fer tan\u0131mland\u0131\u011f\u0131ndan, bu parametreyi \u00e7a\u011fr\u0131 s\u0131ras\u0131nda belirtmek zorunda de\u011filiz. E\u011fer lastName sa\u011flanmazsa, lambda ifadesi varsay\u0131lan de\u011fer olan bo\u015f string\u2019i kullan\u0131r. Bu, \u00f6zellikle opsiyonel parametrelerle \u00e7al\u0131\u015f\u0131rken kodun okunabilirli\u011fini ve temizli\u011fini art\u0131r\u0131r.<\/p>\n\n\n\n<p>Varsay\u0131lan lambda parametreleri, kodun daha esnek ve k\u0131sa olmas\u0131n\u0131 sa\u011flarken, fonksiyonlar\u0131 daha az parametreyle \u00e7a\u011f\u0131rman\u0131za olanak tan\u0131yarak, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve kodun anla\u015f\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-4-alias-any-type\">4.Alias Any Type<\/h4>\n\n\n\n<p>C# dilinde \u201calias\u201d kullan\u0131m\u0131, belirli bir t\u00fcr veya koleksiyona k\u0131sa ve anlaml\u0131 bir isim vererek kodun okunabilirli\u011fini ve y\u00f6netilebilirli\u011fini art\u0131rmak i\u00e7in kullan\u0131l\u0131r. Bu yakla\u015f\u0131m, \u00f6zellikle belirli bir t\u00fcr\u00fc s\u0131k\u00e7a kullan\u0131yorsan\u0131z veya karma\u015f\u0131k t\u00fcr tan\u0131mlamalar\u0131n\u0131 sadele\u015ftirmek istiyorsan\u0131z olduk\u00e7a yararl\u0131d\u0131r.<\/p>\n\n\n\n<p>C# 12 ve .NET 8 ile gelen bu \u00f6zellik, t\u00fcrleri kendi projenizin context yap\u0131s\u0131na uygun semantik isimlerle adland\u0131rman\u0131za olanak tan\u0131r. Bu, \u00f6zellikle domain-driven design (DDD) gibi yakla\u015f\u0131mlarda, t\u00fcrlerin i\u015f domainine \u00f6zg\u00fc anlamlar\u0131n\u0131 vurgulamak i\u00e7in kullan\u0131labilir.<\/p>\n\n\n\n<p>\u00d6rne\u011fin, bir List t\u00fcr\u00fcn\u00fc s\u0131k\u00e7a kullan\u0131yorsunuz ve bu, projenizde belirli bir context \u00fczerinde \u201cUsers\u201d olarak anlam kazan\u0131yorsa, bu t\u00fcr i\u00e7in bir \u201cusing\u201d alias tan\u0131mlayabilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>using Users = System.Collections.Generic.List&lt;User&gt;;<\/em><\/code><\/pre>\n\n\n\n<p>Bu alias tan\u0131m\u0131ndan sonra, List yerine Users kullanarak kodunuzu daha anlaml\u0131 ve okunabilir hale getirebilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>public Users GetUsers()\n{\n    return\n    &#91;\n        new User { Username = \"kerem.gumus\" },\n        new User { Username = \"gamze.gumus\" }\n    ];\n}<\/em><\/code><\/pre>\n\n\n\n<p>Bir di\u011fer kullan\u0131m senaryosu da, birden fazla de\u011fer d\u00f6nd\u00fcrmek istedi\u011finizde ve bunun i\u00e7in her seferinde yeni bir s\u0131n\u0131f veya struct tan\u0131mlamak istemedi\u011finizde ortaya \u00e7\u0131kar. Bu durumda, Tuple t\u00fcrlerine alias tan\u0131mlayarak, tekrarlayan tuple tan\u0131mlamalar\u0131n\u0131 azaltabilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>using Person = System.ValueTuple&lt;string, string&gt;;<\/em><\/code><\/pre>\n\n\n\n<p>Bu takma ad\u0131 kullanarak, metodunuzdan bir Person tuple\u2019\u0131 d\u00f6nd\u00fcrebilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>public Person Get()\n{\n    return (\"Kerem\", \"Gumus\");\n}\n\npublic List&lt;Person&gt; GetAll()\n{\n    return \n    &#91;\n        (\"Kerem\", \"Gumus\"), \n        (\"Gamze\", \"Gumus\")\n    ];\n}<\/em><\/code><\/pre>\n\n\n\n<p>Alias kullan\u0131m\u0131, kodunuzun belli k\u0131s\u0131mlar\u0131n\u0131 semantik olarak daha anlaml\u0131 hale getirirken, ayn\u0131 zamanda tekrarlanan t\u00fcr tan\u0131mlar\u0131n\u0131 sadele\u015ftirerek projenin genel anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, t\u00fcrler aras\u0131ndaki ili\u015fkilerin daha a\u00e7\u0131k ve net olmas\u0131n\u0131 sa\u011flar ve geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-5-experimental-attribute\">5.Experimental Attribute<\/h4>\n\n\n\n<p>C# 12 ve .NET 8 s\u00fcr\u00fcmleriyle, geli\u015ftiricilerin belirli \u00f6zellikleri veya kod bloklar\u0131n\u0131 \u201cdeneysel\u201d olarak i\u015faretlemelerine olanak tan\u0131yan yeni bir \u00f6zellik sunulmu\u015ftur. Bu, Experimental Attribute kullan\u0131larak yap\u0131l\u0131r. Bu nitelik, belirli bir kod par\u00e7as\u0131n\u0131n deneme a\u015famas\u0131nda oldu\u011funu ve gelecekte de\u011fi\u015fikli\u011fe u\u011frayabilece\u011fini veya tamamen kald\u0131r\u0131labilece\u011fini belirtir. Yani bu, i\u015faretlenen \u00f6zelliklerin veya kod bloklar\u0131n\u0131n stabil olmad\u0131\u011f\u0131n\u0131 ve development ortam\u0131nda kullan\u0131mlar\u0131n\u0131n riskli olabilece\u011fini g\u00f6sterir.<\/p>\n\n\n\n<p>Bu nitelik, \u00f6zellikle b\u00fcy\u00fck ve s\u00fcrekli g\u00fcncellenen kod tabanlar\u0131 i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. Geli\u015ftiriciler, belirli \u00f6zelliklerin kullan\u0131m\u0131n\u0131 s\u0131n\u0131rlamak veya geli\u015ftirme s\u00fcrecindeki di\u011fer ekip \u00fcyelerini bu \u00f6zelliklerin potansiyel de\u011fi\u015fikliklere a\u00e7\u0131k oldu\u011fu konusunda uyarmak i\u00e7in Experimental Attribute kullanabilirler.<\/p>\n\n\n\n<p>\u00d6rne\u011fin, yeni bir \u00fcr\u00fcn silme \u00f6zelli\u011fi ekliyorsunuz ve bu \u00f6zelli\u011fi deneysel olarak i\u015faretlemek istiyorsun\ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>&#91;Experimental(\"Feature07\")]\npublic void DeleteAllProducts()\n{\n    _context.Database.ExecuteSqlRaw(\"DELETE FROM Products\");\n}<\/em><\/code><\/pre>\n\n\n\n<p>Bu \u00f6zelli\u011fi kullanmaya \u00e7al\u0131\u015fmak, derleme zaman\u0131nda bir hata \u00fcretir, \u00e7\u00fcnk\u00fc \u00f6zelli\u011fin deneysel oldu\u011fu ve stabil olmad\u0131\u011f\u0131 belirtilmi\u015ftir. E\u011fer deneysel \u00f6zelli\u011fi yine de kullanmak istiyorsan\u0131z, derleme hatas\u0131n\u0131 bask\u0131lamak i\u00e7in uygun pragma kullanabilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>#pragma warning disable Feature07\n_context.Database.ExecuteSqlRaw(\"DELETE FROM Products\");\n#pragma warning restore Feature07<\/em><\/code><\/pre>\n\n\n\n<p>Bu kullan\u0131m, \u00f6zellikle deneysel \u00f6zellikleri denemek isteyen ancak stabilite garantisi olmad\u0131\u011f\u0131n\u0131 bilen geli\u015ftiriciler i\u00e7in uygundur. Ayr\u0131ca, bu yakla\u015f\u0131m sayesinde, gelecekteki de\u011fi\u015fiklikler i\u00e7in kodunuzu haz\u0131rl\u0131kl\u0131 hale getirir ve gerekti\u011finde h\u0131zl\u0131 bir \u015fekilde adaptasyon yapabilmenizi sa\u011flar. Geli\u015ftiricilere sunulan bu esneklik, yenilik\u00e7i \u00f6zelliklerin erken safhalarda denenebilmesine ve geri bildirimlerin toplanabilmesine olanak tan\u0131rken, stabilite ve g\u00fcvenilirlikten \u00f6d\u00fcn vermemeyi ama\u00e7lar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-6-inline-arrays\">6.Inline Arrays<\/h4>\n\n\n\n<p>Performans hassasiyeti olan senaryolar i\u00e7in \u201cInline Arrays\u201d ad\u0131 verilen bir \u00f6zellik tan\u0131t\u0131lm\u0131\u015ft\u0131r. Bu \u00f6zellik, \u00f6zellikle bellek d\u00fczeni ve veri yerle\u015fimi \u00fczerinde daha fazla kontrol gerektiren durumlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. Inline Arrays, derleyicinin diziyi haf\u0131zada ard\u0131\u015f\u0131k bir blok olarak ay\u0131rmas\u0131n\u0131 sa\u011flayarak, normal dizilere g\u00f6re bellek tahsisinde ve eri\u015fimde potansiyel olarak daha verimli olabilir.<\/p>\n\n\n\n<p>System.Runtime.CompilerServices namespace&#8217;ini kullanarak tan\u0131mlanan InlineArray niteli\u011fi, belirli bir boyut i\u00e7in \u00f6nceden bellek ay\u0131r\u0131r. Bu, genellikle sabit boyutlu bir diziye ihtiya\u00e7 duydu\u011funuzda ve bu dizinin performans\u0131n\u0131n kritik oldu\u011fu durumlarda kullan\u0131l\u0131r.<\/p>\n\n\n\n<p>\u00d6rne\u011fin, a\u015fa\u011f\u0131daki gibi bir MyArray yap\u0131s\u0131 olu\u015fturabilirsiniz \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code><em>using System.Runtime.CompilerServices;\n\n&#91;InlineArray(5)]\npublic struct MyArray&lt;T&gt;\n{\n    private T _element;\n}<\/em><\/code><\/pre>\n\n\n\n<p>Bu yap\u0131, be\u015f elemanl\u0131 bir dizi olarak i\u015flev g\u00f6r\u00fcr ve normal bir dizi gibi kullan\u0131labilir \ud83d\udc47\ud83c\udffb<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"wp-block-preformatted has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(169,184,195) 0%,rgb(240,242,244) 0%)\"><code>v<\/code>ar users = new MyArray&lt;User&gt;();\n\nfor (int i = 0; i &lt; 5; i++)\n{\n    users[i] = new User();\n}\n\nforeach (var user in users)\n{\n    Console.WriteLine(user.FirstName + \" \" + user.LastName);\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>Burada MyArray yap\u0131s\u0131 InlineArray niteli\u011fi ile s\u00fcslendi\u011finden, derleyici bu yap\u0131 i\u00e7in be\u015f elemanl\u0131k bir haf\u0131za alan\u0131 ay\u0131r\u0131r ve bu yap\u0131y\u0131 kullanarak dizi benzeri i\u015flemler yap\u0131labilir.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><\/p>\n<cite>\u2757 Bu \u00f6zellik zor kar\u015f\u0131la\u015f\u0131lan durumlar i\u00e7in tasarlanm\u0131\u015ft\u0131r ve belirli durumlar d\u0131\u015f\u0131nda genel kullan\u0131m i\u00e7in \u00f6nerilmemektedir.<\/cite><\/blockquote>\n\n\n\n<p>Inline Arrays\u2019in kullan\u0131m\u0131, performans\u0131 kritik uygulamalar i\u00e7in yararl\u0131d\u0131r, \u00e7\u00fcnk\u00fc bu \u00f6zellik bellek yerle\u015fimini optimize etmeye ve gereksiz bellek \u00e7a\u011fr\u0131lar\u0131n\u0131 azaltmaya yard\u0131mc\u0131 olur. Bu, bellek bant geni\u015fli\u011fi k\u0131s\u0131tlamalar\u0131 olan sistemlerde veya \u00e7ok d\u00fc\u015f\u00fck gecikme s\u00fcreleri gerektiren uygulamalarda faydal\u0131 olabilir. Ancak, bu t\u00fcr optimizasyonlar\u0131n gereklili\u011fi, uygulaman\u0131n gereksinimleri ve performans hedefleri do\u011frultusunda de\u011ferlendirilmelidir.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-7-raw-string-literals\">7.Raw String Literals<\/h4>\n\n\n\n<p>C# 11 ile gelen ve .NET 7&#8217;de kullan\u0131ma sunulan Raw String Literals, \u00f6zellikle \u00e7ok sat\u0131rl\u0131 string ifadelerin ve \u00f6zel karakterler i\u00e7eren metinlerin kolayca yaz\u0131lmas\u0131n\u0131 sa\u011flayan bir \u00f6zelliktir. Bu \u00f6zellik, C# 12 ve .NET 8 ile devam eden s\u00fcr\u00fcmlerde de kullan\u0131lmaya devam etmektedir ve \u00f6zellikle JSON, HTML veya SQL gibi belirli formatlarda metinleri kod i\u00e7erisinde temsil etmek istedi\u011finizde b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n\n\n\n<p>Raw String Literal, normal string literallerinden farkl\u0131 olarak, escape sequence\u2019leri (\\n, \\t gibi) kullanman\u0131za gerek kalmadan metni oldu\u011fu gibi yazman\u0131z\u0131 sa\u011flar. Ayr\u0131ca, $ i\u015fareti ile birle\u015ftirildi\u011finde string i\u00e7erisinde direkt olarak C# ifadeleri yerle\u015ftirilebilir, bu da string interpolation i\u015flemini daha da g\u00fc\u00e7lendirir.<\/p>\n\n\n\n<p>Raw String Literal kullanarak SQL sorgular\u0131n\u0131 yazmak olduk\u00e7a basittir:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(90deg,rgb(155,81,224) 0%,rgb(240,242,244) 0%)\"><code>var minPrice = 100;\nvar maxPrice = 1000;\n\nvar query = $\"\"\"\n    SELECT * \n    FROM Products\n    WHERE Price &gt; {minPrice} and Price &lt; {maxPrice}\n    ORDER BY Price DESC\n\"\"\";<\/code><\/pre>\n\n\n\n<p>Bu \u00f6rnekte &#8220;&#8221;&#8221; ile ba\u015flay\u0131p biten bir Raw String Literal tan\u0131mlanm\u0131\u015f ve i\u00e7erisinde birden \u00e7ok sat\u0131r ve C# ifadesi bulunmaktad\u0131r. C# derleyicisi bu ifadeleri uygun \u015fekilde i\u015fler ve SQL sorgusunu olu\u015fturur.<\/p>\n\n\n\n<p>JSON string\u2019leri i\u00e7in de benzer bir kullan\u0131m s\u00f6z konusudur:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background has-small-font-size\" style=\"background:linear-gradient(135deg,rgb(240,242,244) 100%,rgb(155,81,224) 100%)\"><code>var id = 1;\nvar firstName = \"Kerem\";\nvar lastName = \"Gumus\";\n\nvar json = $$\"\"\"\n    {\n        \"id\": \"{{id}}\",\n        \"firstName\": \"{{firstName}}\",\n        \"lastName\": \"{{lastName}}\"\n    }\n\"\"\";<\/code><\/pre>\n\n\n\n<p>Burada $$&#8221;&#8221;&#8221; ile kullan\u0131lan Raw String Literal, i\u00e7erisinde yer de\u011fi\u015ftirme alanlar\u0131 ({{id}}, {{firstName}}, {{lastName}}) kullan\u0131larak bir JSON metni olu\u015fturmak i\u00e7in kullan\u0131lm\u0131\u015ft\u0131r.<\/p>\n\n\n\n<p>Raw String Literal, \u00f6zellikle .NET 7&#8217;yi atlay\u0131p do\u011frudan .NET 8&#8217;e ge\u00e7en geli\u015ftiriciler i\u00e7in de \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu \u00f6zellikle daha \u00f6nce kar\u015f\u0131la\u015fmad\u0131klar\u0131 bir kolayl\u0131k ve esneklikle kar\u015f\u0131la\u015facaklard\u0131r. Bu \u00f6zellik, karma\u015f\u0131k string i\u015flemleri gerektiren durumlarda kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<\/p>\n\n\n\n<p>Makaleyi faydal\u0131 bulduysan\u0131z takip ederek destek olabilirsiniz \ud83d\ude4f<\/p>\n\n\n\n<p>Bir sonraki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere \ud83d\ude0a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>.NET 8 ve C# Kas\u0131m 2023 s\u00fcr\u00fcm\u00fc, .NET d\u00fcnyas\u0131nda sadece bir s\u00fcr\u00fcm y\u00fckseltmesi de\u011fil, ayn\u0131 zamanda ASP.NET Core proje geli\u015ftirmenin gelece\u011fini \u015fekillendirecek yeniliklerle dolu bir d\u00f6n\u00fcm noktas\u0131d\u0131r. Yeni s\u00fcr\u00fcm, performans iyile\u015ftirmelerinden kod yazma pratiklerine, verimlili\u011fi art\u0131ran \u00f6zelliklerden geli\u015ftirici deneyimini zenginle\u015ftiren ara\u00e7lara kadar bir s\u00fcr\u00fc yenilik getiriyor. Makalede Primary Constructors, Collection Expressions, Default Lambda Parameters gibi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":551,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[38,37],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/posts\/546"}],"collection":[{"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/comments?post=546"}],"version-history":[{"count":5,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/posts\/546\/revisions"}],"predecessor-version":[{"id":556,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/posts\/546\/revisions\/556"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/media\/551"}],"wp:attachment":[{"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/media?parent=546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/categories?post=546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.keremgumus.com\/index.php\/wp-json\/wp\/v2\/tags?post=546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}