﻿
{"id":5985,"date":"2017-04-15T06:01:22","date_gmt":"2017-04-15T06:01:22","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=5985"},"modified":"2017-04-15T06:01:22","modified_gmt":"2017-04-15T06:01:22","slug":"cta-operator-asiri-yuklemeoperator-overloading","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-operator-asiri-yuklemeoperator-overloading\/","title":{"rendered":"C#&#8217;ta Operat\u00f6r A\u015f\u0131r\u0131 Y\u00fckleme(Operator Overloading)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bunca y\u0131ld\u0131r C# \u00fczerinde syntax yap\u0131s\u0131 ve OOP ile ilgili bir \u00e7ok makale ele alm\u0131\u015f bulunmaktay\u0131m. Her ne kadar t\u00fcm konulara de\u011finmek i\u00e7in \u00e7aba harcasamda mevcut platform gere\u011fi(blog) \u00f6nem arz eden ve genel ge\u00e7er kullan\u0131\u015fl\u0131l\u0131\u011fa sahip yap\u0131lar\u0131 tan\u0131tma gere\u011fi duymaktay\u0131m. Hal b\u00f6yle olunca aylarca akl\u0131mda olan ama bir t\u00fcrl\u00fc oturupta \u00fczerinde makale derleyecek vakti yaratamad\u0131\u011f\u0131m bir o kadar da konu var ki i\u015fte Operator Overloading onlardan biri&#8230; Art\u0131k C#&#8217;\u0131n bu g\u00fczel ve k\u00f6kl\u00fc nimetlerine kendi blo\u011fumda yer verme zaman\u0131 geldi\u011fini d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>C# yap\u0131sal olarak \u00e7ok g\u00fczel ve g\u00fc\u00e7l\u00fc bir dil olmakla beraber her ge\u00e7en g\u00fcn g\u00fcc\u00fcne g\u00fc\u00e7 katmakta, kendini geli\u015ftirerek yenilemektedir. Do\u011fal olarak bu potansiyel dilin mekani\u011fine yans\u0131makta ve biz yaz\u0131l\u0131mc\u0131lar\u0131n dil se\u00e7imindeki en b\u00fcy\u00fck tercihi bu potansiyel s\u0131rda aranmaktad\u0131r.<\/p>\n<p>Bana sorarsan\u0131z C# dilinin bu potansiyel g\u00fcc\u00fcn\u00fcn en m\u00fchim yap\u0131lar\u0131 aras\u0131nda s\u0131n\u0131flarda olu\u015fturulabilen kendine has yap\u0131lardan operat\u00f6r metotlar\u0131 bulunmaktad\u0131r.<\/p>\n<p><strong><em>Ne mi bu operat\u00f6r metotlar\u0131?<\/em><\/strong><\/p>\n<p>Biliyorsunuz ki, programlamada birden fazla de\u011fer aras\u0131nda ba\u011f\u0131nt\u0131 olu\u015fturdu\u011fumuz sembollere operat\u00f6r demekteyiz. Bu operat\u00f6rler genel olarak kulland\u0131\u011f\u0131m\u0131z birden fazla say\u0131 aras\u0131nda matematiksel i\u015flem yapan aritmatik operat\u00f6rler(+, -, \/, *), birden fazla de\u011fer aras\u0131nda kar\u015f\u0131la\u015ft\u0131rma yapan kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri(&lt;, &gt;, &lt;=, &gt;=, ==, !=), \u015fart &#8211; ko\u015ful yap\u0131lar\u0131nda kulland\u0131\u011f\u0131m\u0131z mant\u0131ksal operat\u00f6rler(&amp;, &amp;&amp;, |, ||, !, ^) ve yerine g\u00f6re bunlar\u0131n d\u0131\u015f\u0131nda kulland\u0131\u011f\u0131m\u0131z niceleri de\u011ferler aras\u0131 g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere i\u015flem yapmaktad\u0131rlar.<\/p>\n<p>\u00d6rnek olarak 2 + 5 \u015feklinde tan\u0131mlanan bir ifade programatik a\u00e7\u0131dan ele al\u0131nd\u0131\u011f\u0131nda 7 sonucunu verecektir. \u00c7\u00fcnk\u00fc &#8220;+&#8221; operat\u00f6r\u00fc verilen iki say\u0131sal de\u011fer aras\u0131nda bir matematiksel toplama i\u015flemi yapmakla g\u00f6revlendirilmi\u015ftir. Benzer \u015fekilde bu g\u00f6revlendirme di\u011fer matematik sembolleri i\u00e7inde ge\u00e7erlidir. Asl\u0131nda bu i\u015flevler say\u0131sal de\u011ferlere \u00f6zel bir operator overloading yap\u0131ld\u0131\u011f\u0131 i\u00e7in ger\u00e7ekle\u015ftirilmektedir. Buradan \u015fu sonucu \u00e7\u0131karabilir ki; say\u0131sal de\u011ferlerde oldu\u011fu gibi g\u00f6revi mimarisel olarak belirlenmi\u015f operat\u00f6rlerin tiplerine bizler tekrardan operator overloading i\u015flemi yapamamaktay\u0131z.<\/p>\n<p>Peki&#8230; + operat\u00f6r\u00fcn\u00fc yeniden ele al\u0131rsak e\u011fer, iki say\u0131sal de\u011fer aras\u0131na + operat\u00f6r\u00fcn\u00fc koyarsak matematiksel toplama i\u015flemi yap\u0131yordu. Peki kendi olu\u015fturdu\u011fumuz herhangi bir s\u0131n\u0131f\u0131n nesneleri yahut nesnelerini i\u015faretleyen referanslar\u0131 aras\u0131nda + operat\u00f6r\u00fcn\u00fc kullan\u0131rsak ne olacak?<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            MyClass m1 = new MyClass();\r\n            MyClass m2 = new MyClass();\r\n            m1 + m2;\r\n        }\r\n    }\r\n\r\n    class MyClass\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte \u015fu d\u00fczeyde bu tarz bir kullan\u0131mdan hata al\u0131nacakt\u0131r. Nihayetinde + operat\u00f6r\u00fcn\u00fcn kendi olu\u015fturmu\u015f oldu\u011fumuz MyClass isimli s\u0131n\u0131f i\u00e7in bir i\u015flevselli\u011fini tan\u0131mlamad\u0131\u011f\u0131m\u0131zdan dolay\u0131 yukar\u0131daki \u00e7al\u0131\u015fmada operat\u00f6r iki nesne aras\u0131nda nas\u0131l bir i\u015flevde bulunaca\u011f\u0131n\u0131 bilememektedir. \u0130\u015fte biz \u00f6rnekteki MyCLass misali kendi olu\u015fturmu\u015f oldu\u011fumuz s\u0131n\u0131flar\u0131m\u0131z i\u00e7in herhangi bir operat\u00f6re overload uygulayabilecek ve ilgili operat\u00f6re ilgili s\u0131n\u0131f \u00fczerindeki kullan\u0131\u015f\u0131l\u0131nda farkl\u0131 bir i\u015flevsellik y\u00fckleyece\u011fiz.<\/p>\n<p>Tabi bu i\u015flemi yapmadan \u00f6nce de\u011finmek istedi\u011fim bir husus mevcuttur.<\/p>\n<p>Biliyorsunuz ki, string tipi de\u011fer tipli gibi ifade edilebilen ama aslen referans \u00f6zellikli bir tiptir. Referans type olan bu string tipinde birden fazla string ifadeler aras\u0131nda + operat\u00f6r\u00fcn\u00fc kullan\u0131rsak e\u011fer string ifadeleri yan yana birle\u015ftirmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string Ad = &quot;Gen\u00e7ay&quot;;\r\n            string SoyAd = &quot;Y\u0131ld\u0131z&quot;;\r\n            string AdSoyad = Ad + &quot; &quot; + SoyAd;\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Ad ve SoyAd de\u011fi\u015fkenleri aras\u0131nda + operat\u00f6r\u00fc kullan\u0131ld\u0131\u011f\u0131 vakit tekrardan string bir sonu\u00e7 elde edilmektedir.<\/p>\n<p><em>Peki compiler bu i\u015flemi nas\u0131l ele almaktad\u0131r?<\/em><\/p>\n<p>Derleme i\u015flemi esnas\u0131nda compiler s\u0131n\u0131f yap\u0131lar\u0131 \u00fczerinde operat\u00f6r kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fc\u011f\u00fc vakit ilgili s\u0131n\u0131f i\u00e7erisinde operator+ isimli metodu arayacakt\u0131r. E\u011fer ki bu metodu bulamazsa hata verecektir. S\u00f6z konusu s\u0131n\u0131f\u0131m\u0131z String s\u0131n\u0131f\u0131 oldu\u011fu i\u00e7in arayaca\u011f\u0131 metot aynen \u015fu \u015fekilde olacakt\u0131r.<\/p>\n<blockquote><p><span style=\"color: #800080;\"><em>String.operator+(a, b);<\/em><\/span><\/p><\/blockquote>\n<p>Dikkat ederseniz aranan operator+ metoduna ilgili s\u0131n\u0131f\u0131n ismi \u00fczerinden eri\u015filmektedir. Yani buradan operat\u00f6r metotlar\u0131n\u0131n static yap\u0131da olaca\u011f\u0131n\u0131 \u00e7\u0131kar\u0131yoruz. <\/p>\n<p>\u015eimdi kendi olu\u015fturmu\u015f oldu\u011fumuz bir s\u0131n\u0131fa operat\u00f6r y\u00fcklemeye de\u011finmeye bir ad\u0131m kala operator overloading i\u015flemi i\u00e7in dikkat edilmesi gereken kurallara ve k\u0131s\u0131tlamalara de\u011finelim.<\/p>\n<ul>\n<li>\nOperat\u00f6r metotlar\u0131 static olarak tan\u0131mlanmal\u0131d\u0131r.\n<\/li>\n<li>\nOperat\u00f6r metotlar\u0131n\u0131n isimleri <strong><em>operator<\/em><\/strong> keyword\u00fc ile birlikte kullan\u0131lacak operat\u00f6r\u00fcn sembol\u00fc verilerek belirlenir.<\/p>\n<p>operator+, operat\u00f6r*, opreator<= vs. gibi...\n<\/li>\n<li>\nOperat\u00f6r metotlar\u0131n\u0131n en az bir parametresi olmal\u0131d\u0131r.\n<\/li>\n<li>\nOperat\u00f6r metotlar\u0131da normal metotlar gibi \u00e7oklu y\u00fcklenebilir.\n<\/li>\n<li>\nTekil(Unary) operat\u00f6r metotlar\u0131nda parametre mutlaka ilgili s\u0131n\u0131f t\u00fcr\u00fcnden olmal\u0131d\u0131r. Binary(iki operand alan) operat\u00f6r metotlar\u0131ndan ise en az bir parametre ilgili s\u0131n\u0131f t\u00fcr\u00fcnden olmal\u0131d\u0131r.\n<\/li>\n<li>\nOperat\u00f6r metotlar\u0131 ref ve out anahtar s\u00f6zc\u00fcklerinden parametre alamazlar.\n<\/li>\n<li>\n+=, -=, \/= ve *= operat\u00f6rlerinin a\u015f\u0131r\u0131 y\u00fcklenmeleri olmamaktad\u0131r. \u0130lgili operat\u00f6rlerin kullan\u0131mlar\u0131 durumunda direkt olarak assign(=) operat\u00f6r\u00fc olmayan kar\u015f\u0131l\u0131\u011f\u0131n\u0131 tetiklemektedir.<\/p>\n<p>\u00d6rnek x += b durumu operator+ metodunu tetikleyecektir.\n<\/li>\n<li>\nOperat\u00f6rlerin \u00f6ncelik s\u0131ras\u0131 de\u011fi\u015fmez.\n<\/li>\n<li>\nTemel veri t\u00fcrleri i\u00e7in operat\u00f6rleri yeniden y\u00fckleyemeyiz.\n<\/li>\n<li>\n&#038;&#038;, ||, [], (), =, ?, ., ?:, ->, is, sizeof, new ve typeof gibi operat\u00f6rlere a\u015f\u0131r\u0131 y\u00fckleme yap\u0131lamaz.\n<\/li>\n<\/ul>\n<p>Evet&#8230; \u015eimdi a\u015fa\u011f\u0131daki gibi kendi olu\u015fturmu\u015f oldu\u011fumuz bir s\u0131n\u0131fta operat\u00f6rleri a\u015f\u0131r\u0131 y\u00fckleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Dunya\r\n    {\r\n        public int Cap { get; set; }\r\n        public static Dunya operator +(Dunya d1, Dunya d2) =&gt; new Dunya { Cap = d1.Cap + d2.Cap };\r\n        public static string operator -(Dunya d1, Dunya d2) =&gt; (d1.Cap - d2.Cap).ToString();\r\n        public static Dunya operator \/(Dunya d1, int d2) =&gt; new Dunya { Cap = d1.Cap \/ d2 };\r\n        public static decimal operator *(Dunya d1, int d2) =&gt; d1.Cap * d2;\r\n    }\r\n<\/pre>\n<p>Bu operat\u00f6rlerin kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Dunya d1 = new Dunya() { Cap = 36 };\r\n            Dunya d2 = new Dunya() { Cap = 18 };\r\n\r\n            Dunya Topla = d1 + d2;\r\n            Console.WriteLine(Topla.Cap);\r\n\r\n            string Cikar = d1 - d2;\r\n            Console.WriteLine(Cikar);\r\n\r\n            Dunya Bol = d1 \/ 120;\r\n            Console.WriteLine(Bol.Cap);\r\n\r\n            decimal Carp = d1 * 120;\r\n            Console.WriteLine(Carp);\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/04\/Cta-Operat\u00f6r-A\u015f\u0131r\u0131-Y\u00fcklemeOperator-Overloading.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/04\/Cta-Operat\u00f6r-A\u015f\u0131r\u0131-Y\u00fcklemeOperator-Overloading.png\" alt=\"C#&#039;ta Operat\u00f6r A\u015f\u0131r\u0131 Y\u00fckleme(Operator Overloading)\" width=\"83\" height=\"97\" class=\"aligncenter size-full wp-image-6008\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi olu\u015fturmu\u015f oldu\u011fumuz s\u0131n\u0131flara \u00f6zel operat\u00f6rlerin nas\u0131l \u00e7oklu y\u00fcklendi\u011fini incelemi\u015f olduk. Sonraki yaz\u0131lar\u0131m\u0131zda d\u00f6n\u00fc\u015f\u00fcm operat\u00f6rleri olan implicit(istemsiz\/kapal\u0131) ve explicit(istemli\/a\u00e7\u0131k) operat\u00f6rlerinin a\u015f\u0131r\u0131 y\u00fcklenmesini inceleyece\u011fiz.<\/p>\n<p>Sonraki 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, Bunca y\u0131ld\u0131r C# \u00fczerinde syntax yap\u0131s\u0131 ve OOP ile ilgili bir \u00e7ok makale ele alm\u0131\u015f bulunmaktay\u0131m. Her ne kadar t\u00fcm konulara de\u011finmek i\u00e7in \u00e7aba harcasamda mevcut platform gere\u011fi(blog) \u00f6nem arz eden ve genel&#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":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1730,1725,1728,1727,1726,67,1729],"class_list":["post-5985","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-aritmetik-operatorlerinin-asiri-yuklenmesi","tag-cta-operator-asiri-yukleme","tag-operator","tag-operator-overload","tag-operator-overloading","tag-overload","tag-unary"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5985","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=5985"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5985\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=5985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=5985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=5985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}