﻿
{"id":28581,"date":"2026-03-31T08:44:14","date_gmt":"2026-03-31T08:44:14","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28581"},"modified":"2026-03-31T08:44:14","modified_gmt":"2026-03-31T08:44:14","slug":"c-14-ile-extensionlar-bastan-yazildi-yeni-syntax-neler-getiriyor","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-14-ile-extensionlar-bastan-yazildi-yeni-syntax-neler-getiriyor\/","title":{"rendered":"C# 14 ile Extension&#8217;lar Ba\u015ftan Yaz\u0131ld\u0131: Yeni Syntax Neler Getiriyor?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n<br \/>\nC# 14 ile gelen <strong>Extension Members<\/strong> \u00f6zelli\u011fi, klasik <a href=\"https:\/\/www.gencayyildiz.com\/blog\/extension-metod-yazilisi-ve-kullanimi\/\" target=\"_blank\">extension method<\/a> kavram\u0131n\u0131 ciddi anlamda geni\u015fletmekte ve art\u0131k sadece metotlar\u0131 de\u011fil, property ve field member&#8217;lar\u0131n\u0131n ve hatta daha organize extension yap\u0131lar\u0131n\u0131n yaz\u0131labilmesine imkan tan\u0131maktad\u0131r. Bu i\u00e7eri\u011fimizde bu yenili\u011fi ba\u015ftan sona inceleyecek ve C#&#8217;\u0131n yeni g\u00fcc\u00fcne hep birlikte \u015fahit olaca\u011f\u0131z&#8230; Hadi ba\u015flayal\u0131m&#8230;<\/p>\n<h4>Extension Members Nedir?<\/h4>\n<p>Extension members, C# 3.0&#8217;dan beri var olan extension methods yap\u0131lanmas\u0131n\u0131n C# 14 ile birlikte \u00e7ok daha g\u00fc\u00e7lendirilmi\u015f ve geni\u015fletilmi\u015f halidir.<\/p>\n<p>H\u0131zl\u0131ca extension metotlar\u0131 hat\u0131rlamam\u0131z gerekirse e\u011fer; elimizdeki herhangi bir t\u00fcre farkl\u0131 bir konumdan yeni bir metot\/davran\u0131\u015f ekleyebilmemizi sa\u011flayan bir teknikti&#8230; Misal olarak;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Person\r\n{\r\n    public string Name { get; set; }\r\n    public string Surname { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<p>t\u00fcr\u00fcn\u00fc tan\u0131mlad\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m. Bu t\u00fcre farkl\u0131 bir konumdan herhangi bir davran\u0131\u015f eklemek istiyorsak burada, a\u015fa\u011f\u0131daki gibi static bir s\u0131n\u0131f i\u00e7erisinde <code>this<\/code> keyword&#8217;\u00fc e\u015fli\u011finde o t\u00fcrden bir parametreyi alan static \u00f6zel bir metot tan\u0131mlamam\u0131z gerekmekteydi;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstatic class Extension\r\n{\r\n    static public string GetFullName(this Person person)\r\n        =&gt; $&quot;{person.Name} {person.Surname}&quot;;\r\n}\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu metot, bir extension metottur. <code>this<\/code> keyword&#8217;\u00fc ile belirtilen referans\u0131n <em>(Person)<\/em> instance&#8217;\u0131na yeni bir davran\u0131\u015f kazand\u0131rmaktad\u0131r. B\u00f6ylece, normal \u015fartlarda herhangi bir <em>Person<\/em> instance&#8217;\u0131n\u0131n member&#8217;lar\u0131na (member access operator ile) eri\u015fti\u011fimiz vakit i\u00e7inde tan\u0131mlanmam\u0131\u015f olsa da <code>GetFullName<\/code> metodunun geldi\u011fini g\u00f6rmekte ve ilgili instance \u00fczerinden eri\u015fip, kullanabiliyor olmaktay\u0131z.<\/p>\n<p>Tabi, klasik extension metot&#8217;larda instance&#8217;a sadece metot eklenebilmekteydi; property, field, operator yahut herhangi bir static member vs. eklenememekteydi. Ve hatta ayn\u0131 t\u00fcre ait birden fazla extension mant\u0131ksal olarak gruplanamamakta, bunlar ayr\u0131 ayr\u0131 yaz\u0131lmak mecburiyetindeydi.<\/p>\n<p>\u0130\u015fte C# 14 ile gelen extension members \u00f6zelli\u011fi ile bu k\u0131s\u0131tlar ortadan kalmakta ve istenilen t\u00fcre metotlar\u0131n d\u0131\u015f\u0131nda, property, static member, operator ve (ileride) indexer gibi di\u011fer member&#8217;lar\u0131da extension olarak ekleyebilme imkan\u0131 s\u00f6z konusu olmaktad\u0131r.<\/p>\n<blockquote><p><em>Microsoft, C# 14&#8217;te gelen bu extension members \u00f6zelli\u011fine, hedef referansa metotlar d\u0131\u015f\u0131nda di\u011fer member&#8217;lar\u0131 da ekleyebilmemizi sa\u011flad\u0131\u011f\u0131 i\u00e7in bir yandan da <strong>Extension Everything<\/strong> ad\u0131n\u0131 vermektedir.<\/em><\/p><\/blockquote>\n<h5>Extension Block<\/h5>\n<p>C# 14 ile art\u0131k bir tipi geni\u015fletirken a\u015fa\u011f\u0131daki gibi extension blok tan\u0131mlayarak rahatl\u0131kla \u00e7al\u0131\u015fma sergilenebilmektedir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstatic class Extension\r\n{\r\n    extension(Person person)\r\n    {\r\n        public string GetFullNameMethod()\r\n            =&gt; $&quot;{person.Name} {person.Surname}&quot;;\r\n\r\n        public string GetFullNameProperty\r\n            =&gt; $&quot;{person.Name} {person.Surname}&quot;;\r\n    }\r\n\r\n    extension(Person)\r\n    {\r\n        static public string GetTypeNameStaticMethod()\r\n             =&gt; nameof(Person);\r\n\r\n        static public string GetTypeNameStaticProperty\r\n             =&gt; nameof(Person);\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Klasik extension metotlar\u0131 nas\u0131l ki static class i\u00e7erisinde tan\u0131ml\u0131yorsak extension block&#8217;larda ayn\u0131 \u015fekilde static bir class i\u00e7erisinde tan\u0131mlanmaktad\u0131rlar. Dikkat ederseniz hedef referansa \u00f6zel, birden fazla metot klasik yakla\u015f\u0131mda oldu\u011fu gibi ayr\u0131 ayr\u0131 tan\u0131mlanmak yerine bir blok i\u00e7erisinde k\u00fcm\u00fclatif tan\u0131mlanabilmekte ve \u00fcst\u00fcne birden fazla member ile de ilgili referans extend edilebilmektedir. Ayr\u0131ca yukar\u0131daki \u00f6rnekte ikinci extension blo\u011funda oldu\u011fu gibi static member&#8217;larda s\u00fcrece dahil edilerek ilgili referans static bellek a\u00e7\u0131s\u0131ndan da extend edilebilmektedir.<\/p>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda generic type&#8217;lar \u00fczerinden de extend i\u015flemi a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirilebilmektedir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstatic class Extension\r\n{\r\n.\r\n.\r\n.\r\n    extension&lt;T&gt;(IEnumerable&lt;T&gt; source)\r\n    {\r\n        public bool IsEmpty =&gt; source.Any();\r\n    }\r\n\r\n    extension&lt;T&gt;(IEnumerable&lt;T&gt; source)\r\n    {\r\n        public static IEnumerable&lt;T&gt; EmptyIfNull(IEnumerable&lt;T&gt;? _)\r\n            =&gt; _ ?? Enumerable.Empty&lt;T&gt;();\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Tabi \u00f6rneklendirme s\u00fcrecinde normal member&#8217;larla static member&#8217;lar aras\u0131ndaki tan\u0131m fark\u0131n\u0131 net yans\u0131tabilmek i\u00e7in ayr\u0131 extension bloklarda \u00f6rneklendirmede bulunuyorum. \u0130stendi\u011fi taktirde bu member&#8217;lar ayn\u0131 blok i\u00e7erisinde de tan\u0131mlanabilir. Sadece static member&#8217;lar\u0131n <code>static<\/code> keyword&#8217;\u00fcyle i\u015faretlenmesi unutulmamal\u0131d\u0131r&#8230;<\/p>\n<p>Ha static member&#8217;lar\u0131n instance&#8217;la i\u015fi olmayaca\u011f\u0131 i\u00e7in extension blo\u011funun parantezindeki t\u00fcr genellikle named(isimlendirilmi\u015f) olmayacak \u015fekilde bir tan\u0131mda bulunulabilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstatic class Extension\r\n{\r\n.\r\n.\r\n.\r\n    extension&lt;T&gt;(IEnumerable&lt;T&gt;)\r\n    {\r\n        public static IEnumerable&lt;T&gt; EmptyIfNull(IEnumerable&lt;T&gt;? _)\r\n            =&gt; _ ?? Enumerable.Empty&lt;T&gt;();\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Ancak bu kullan\u0131m, blokta sadece static \u00fcyeler olacaksa ge\u00e7erlidir. Static ve normal member&#8217;lar\u0131n oldu\u011fu durumlarda instance&#8217;\u0131 referans edecek olan receiver parametresinin verilmesi mecburiyettendir.<\/p>\n<p>Nihai olarak;<br \/>\nBu geli\u015fmeyle, extension yap\u0131lanmas\u0131n\u0131n olmas\u0131 gereken ideal noktaya vard\u0131\u011f\u0131n\u0131 s\u00f6yleyebiliriz. Klasik yakla\u015f\u0131m\u0131 sorarsan\u0131z e\u011fer, evet, hala desteklenmektedir. Ancak k\u0131sa zamanda esamesi okunmayacak de\u011fildir&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, C# 14 ile gelen Extension Members \u00f6zelli\u011fi, klasik extension method kavram\u0131n\u0131 ciddi anlamda geni\u015fletmekte ve art\u0131k sadece metotlar\u0131 de\u011fil, property ve field member&#8217;lar\u0131n\u0131n ve hatta daha organize extension yap\u0131lar\u0131n\u0131n yaz\u0131labilmesine imkan tan\u0131maktad\u0131r. Bu&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":28587,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,5694],"tags":[5696,5698,5695,5697],"class_list":["post-28581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-c-14","tag-c-14","tag-extension-everything","tag-extension-members","tag-extension-method"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=28581"}],"version-history":[{"count":6,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28581\/revisions"}],"predecessor-version":[{"id":28588,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28581\/revisions\/28588"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28587"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}