{"id":655,"date":"2014-01-05T18:19:33","date_gmt":"2014-01-05T18:19:33","guid":{"rendered":"http:\/\/piatkosia.k4be.pl\/wordpress\/?p=655"},"modified":"2014-01-06T12:23:43","modified_gmt":"2014-01-06T12:23:43","slug":"655","status":"publish","type":"post","link":"https:\/\/piatkosia.k4be.pl\/wordpress\/2014\/01\/05\/655\/","title":{"rendered":"[C#] Operatory"},"content":{"rendered":"<p>Artyku\u0142 zg\u0142oszony do konkursu na stronie\u00a0<a href=\"http:\/\/strefainzyniera.pl\/\">http:\/\/strefainzyniera.pl<\/a><\/p>\n<h1>Wst\u0119p<\/h1>\n<p>Wi\u0119kszo\u015b\u0107 oprogramowania, jakie przyjdzie nam pisa\u0107, b\u0119dzie wymaga\u0142a u\u017cycia operator\u00f3w. I nie m\u00f3wi\u0119 tu wy\u0142\u0105cznie o operatorach znanych nam z matematyki \u2013 czyli \u201e+\u201d, \u201e-\u201d i tak dalej. Nawet w najprostszych aplikacjach u\u017cywaj\u0105cych chocia\u017cby instrukcji warunkowej u\u017cywamy operator\u00f3w por\u00f3wnania. Manipuluj\u0105c zmiennymi zwykle u\u017cywamy operator\u00f3w przypisania i konwersji.<br \/>\nOperatory, to nic innego, jak funkcje, kt\u00f3re zwracaj\u0105 warto\u015b\u0107, za wej\u015bcie bior\u0105c warto\u015bci, kt\u00f3re w wersji prefiksowej wyst\u0119puj\u0105 zaraz po znaku, postfiksowej gdy przed znakiem, za\u015b infiksowej, pobiera s\u0105siad\u00f3w po obu stronach. Je\u017celi operator pobiera trzy warto\u015bci, symbole sk\u0142adaj\u0105ce si\u0119 na niego rozdzielaj\u0105 warto\u015bci wej\u015bciowe funkcji wywo\u0142ywanej (niewidocznie dla programisty) przez operator. Tylko operator wywo\u0142ania \u201e()\u201d oraz operator pobrania elementu wskazywanego przez indeks \u201e[]\u201d bior\u0105 sw\u00f3j operand w \u015brodek znak\u00f3w, jakie si\u0119 na niego sk\u0142adaj\u0105.<br \/>\nDzi\u015b om\u00f3wimy jakie mo\u017cliwo\u015bci daj\u0105 nam operatory w j\u0119zyku C#. Pe\u0142n\u0105 ich list\u0119 mo\u017cemy znale\u017a\u0107 w dokumentacji j\u0119zyka, dost\u0119pnej pod adresem http:\/\/msdn.microsoft.com\/pl-pl\/library\/6a71f45d.aspx .<br \/>\n<!--more--><\/p>\n<h1>Zapoznanie si\u0119 z priorytetami dost\u0119pnymi w C#<\/h1>\n<p>Rozpocznijmy od najbardziej znanych nam operator\u00f3w \u2013 matematycznych: \u201e+\u201d jest znakiem dodawania (istnieje wersja unarna, kt\u00f3ra zwraca obecn\u0105 warto\u015b\u0107 \u2013 ale si\u0119 z ni\u0105 nie spotka\u0142am), \u201e-\u201d odejmowania (w wersji infiksowej).oraz zmiany znaku (w wersji prefiksowej), \u201e*\u201d mno\u017cenia, za\u015b \u201e\/\u201d dzielenia. Ostatnim jest reszta z dzielenia, reprezentowana znakiem \u201e%\u201d. Mo\u017cna do tej grupy do\u0142\u0105czy\u0107 operator inkrementacji \u201e++\u201d oraz dekrementacji \u201e&#8211;\u201e, kt\u00f3re kolejno dodaj\u0105 i odejmuj\u0105 jedynk\u0119. Wyst\u0119puj\u0105 w wersji prefixowej oraz postfixowej. Pozosta\u0142e dzia\u0142ania matematyczne wykonujemy przy u\u017cyciu funkcji matematycznych.<br \/>\nNast\u0119pn\u0105 grup\u0105, o kt\u00f3rej warto wspomnie\u0107, s\u0105 operatory logiczne i bitowe. Zacznijmy od negacji, zapisywalnej znakiem \u201e!\u201d \u2013 zmienia w wyniku true na false, a false na true i nie robi nic wi\u0119cej. Je\u017celi chcemy odwr\u00f3ci\u0107 wszystkie bity, na przyk\u0142ad w uint, u\u017cyjemy operatora \u201e~\u201d. Innymi operatorami, kt\u00f3re operuj\u0105 na pojedynczych bitach s\u0105 \u201e&amp;\u201d czyli iloczyn logiczny (AND), \u201e|\u201d suma logiczna (OR) oraz\u201e^\u201d \u2013 r\u00f3\u017cnica symetryczna (XOR). Mo\u017cna do tej grupy r\u00f3wnie\u017c do\u0142\u0105czy\u0107 przesuni\u0119cia bitowe \u201e&lt;&lt;\u201d oraz \u201e&gt;&gt;\u201d, kt\u00f3re po lewej maj\u0105 liczb\u0119 do przesuni\u0119cia, a po prawej o ile bit\u00f3w ma si\u0119 przesun\u0105\u0107 w stron\u0119 jak\u0105 pokazuj\u0105 dzi\u00f3bki. Operatorami logicznymi (zwracaj\u0105cymi true lub false) poza negacj\u0105 (\u201e!\u201d) s\u0105 AND \u201e&amp;&amp;\u201d oraz OR \u201e||\u201d. Najcz\u0119\u015bciej mo\u017cemy je spotka\u0107 w wyra\u017ceniach warunkowych (jak chocia\u017cby if, czy p\u0119tli while), gdzie s\u0142u\u017c\u0105 do \u0142\u0105czenia warunk\u00f3w (w przypadku &amp;&amp; wszystkie musz\u0105 by\u0107 spe\u0142nione, w przypadku || co najmniej jeden z nich). Je\u015bli ju\u017c mowa o wyra\u017ceniach warunkowych, warto wspomnie\u0107 o operatorach relacji, czyli por\u00f3wnania. Kolejno \u201e!=\u201d r\u00f3\u017cny, \u201e&lt;\u201d mniejszy, \u201e&gt;\u201d wi\u0119kszy, \u201e&lt;=\u201d mniejszy lub r\u00f3wny, \u201e&gt;=\u201d wi\u0119kszy lub r\u00f3wny, \u201e==\u201d r\u00f3wny. Warto zwr\u00f3ci\u0107 uwag\u0119 na dwa znaki r\u00f3wno\u015bci (cz\u0119stym b\u0142\u0119dem jest napisanie o jeden za ma\u0142o). Je\u017celi napisaliby\u015bmy tylko jeden, mieliby\u015bmy do czynienia ze znakiem przypisania \u2013 czyli zmiany warto\u015bci zmiennej z lewej strony, na warto\u015b\u0107 (podana wprost, warto\u015b\u0107 funkcji, warto\u015b\u0107 innej zmiennej itd.) z prawej strony. Inne operatory przypisania to \u201e*=\u201d , \u201e \/=\u201d , \u201e%=\u201d , \u201e +=\u201d, \u201e -=\u201d, \u201e &lt;&lt;=\u201d, \u201e &gt;&gt;=\u201d , \u201d&amp;=\u201d, \u201e ^= \u201e oraz \u201e|=\u201d, kt\u00f3re dzia\u0142aj\u0105 w taki spos\u00f3b, \u017ce najpierw bierzemy warto\u015bci po obu stronach operatora, wykonujemy dzia\u0142anie, na kt\u00f3re wskazuje pierwszy znak, a nast\u0119pnie przypisujemy do jego lewej warto\u015bci. Na przyk\u0142ad je\u015bli mamy x=1; x +=5, to do warto\u015bci x (w tym przypadku 1) dodajemy 5, oraz przypisujemy wynik tego dzia\u0142ania do tego x. X od tej chwili ma warto\u015b\u0107 6. Oczywi\u015bcie liczby nie musimy podawa\u0107 wprost, mo\u017cemy tam dla przyk\u0142adu da\u0107 funkcj\u0119, kt\u00f3ra zwraca liczb\u0119 i to ta liczba (zwr\u00f3cona) b\u0119dzie dodana do zmiennej. Og\u00f3lnie x *= y to jest to samo co x = x * y \u2013 w przypadku d\u0142u\u017cszych nazw zmiennych czy wyra\u017ce\u0144, czytelno\u015b\u0107 kodu zostaje poprawiona.<br \/>\nWracaj\u0105c do operator\u00f3w relacji, mamy jeszcze operatory is oraz as, czyli jest oraz jako.<br \/>\nOperator \u201eis\u201d sprawdza czy zmienna jest danego typu, lub implementuje dany interfejs. Obiekt jest danego typu, r\u00f3wnie\u017c za spraw\u0105 dziedziczenia, rzutowania, pude\u0142kowania lub odpude\u0142kowania (boxing, unboxing), u\u017cycia konwersji zdefiniowanej przez u\u017cytkownika, a tak\u017ce wskazania referencj\u0105, wska\u017anikiem itd. S\u0142owem \u2013 zwraca true, je\u017celi obiekt mo\u017ce by\u0107 u\u017cyty jako obiekt danego typu i nie jest nullem. Zazwyczaj ten operator jest u\u017cywany w po\u0142\u0105czeniu do sprawdzenia warunku np. if (obiekt is int){dzialanie_na_liczbie(obiekt);}. Bli\u017aniaczym do niego jest operator \u201eas\u201d, czyli jako. O ile is zwraca\u0142 true, je\u015bli obiekt mo\u017cna by\u0142o u\u017cy\u0107 jako obiekt danego typu, a false je\u015bli nie mo\u017cna (tak, mamy zwyk\u0142y operator logiczny), to as jest w zasadzie operatorem konwersji i m\u00f3wi, aby u\u017cy\u0107 lewego operandu jako obiekt typu pokazanego po prawej stronie. Czyli \u201ewyra\u017cenie as typ\u201d. Wprowadzono ten operator (podobnie jak operatory przypisania i dzia\u0142ania na raz jak +=), dla skr\u00f3cenia zapisu, jako ekwiwalent dla \u201ewyra\u017cenie is typ ? (typ)wyra\u017cenie : (typ)null\u201d (w kt\u00f3rym wyst\u0119puje operator warunku i rzutowania).<br \/>\nM\u00f3wi\u0105c o typach, warto wspomnie\u0107 o operatorze typeof, kt\u00f3ry zwraca typ obiektu (b\u0119d\u0105cy sam obiektem typu System.Type). Robi tak naprawd\u0119 to samo, co funkcja GetType.<br \/>\nPrzy okazji warto opisa\u0107 u\u017cyty powy\u017cej operator (). Wyst\u0119puje on w wersji prefiksowej oraz postfiksowej. W przypadku wersji prefiksowej, mamy do czynienia z operatorem rzutowania, jak powy\u017cej. W przypadku postfiksowej mamy operator wywo\u0142ania, kt\u00f3ry s\u0142u\u017cy do wywo\u0142ania funkcji (a w zasadzie metody) znajduj\u0105cym si\u0119 pod adresem, na jaki wskazuje nazwa. S\u0142u\u017cy on r\u00f3wnie\u017c do wywo\u0142ywania delegat\u00f3w.<br \/>\nW przyk\u0142adzie powy\u017cej znajduje si\u0119 r\u00f3wnie\u017c operator \u201e?:\u201d, zwany operatorem warunku. Mamy \u201ewarunek ? pierwsze_wyra\u017cenie : drugie_wyra\u017cenie\u201d, gdzie pierwsze jest wykonane w przypadku gdy warunek zwr\u00f3ci true, za\u015b drugi gdy zwr\u00f3ci false.<br \/>\nKolejnym operatorem, kt\u00f3ry dzia\u0142a zale\u017cnie od warunku jest \u201e??\u201d, kt\u00f3ry zmienia warto\u015b\u0107 zmiennej tylko w przypadku, gdy jest ona nullem (co za tym idzie, mo\u017ce by\u0107 u\u017cyty wy\u0142\u0105cznie w przypadku typ\u00f3w nullable, takich jak int? czy bool? \u2013 og\u00f3lnie, z pytajnikiem na ko\u0144cu nazwy typu, oraz np. stringa czy typu zdefiniowanego przez nas). Je\u017celi nie jest nullem, zostawia to, co jest. Warto u\u017cy\u0107 chocia\u017cby do utworzenia obiektu, je\u015bli zmienna ma warto\u015b\u0107 null (chocia\u017cby w setterze przy implementacji singletona). Przyk\u0142adem u\u017cycia mo\u017ce by\u0107 sytuacja, kiedy tworzymy nowy obiekt, je\u015bli nie istnieje inny, a je\u015bli istnieje, to go przypisujemy: \u201eKlasa jaki\u015bobiekt = obiekt ?? new Klasa();\u201d, albo je\u015bli chcemy przypisa\u0107 nullable int do int, i chcemy przypisa\u0107 jak\u0105\u015b warto\u015b\u0107, je\u017celi tamta b\u0119dzie nullem: \u201eint? x = null; int y = x ?? 0;\u201d<br \/>\nCiekawym operatorem jest operator wyra\u017ce\u0144 lambda \u201e=&gt;\u201d. Nie zwraca on warto\u015bci liczbowej, ale funkcj\u0119, kt\u00f3r\u0105 mo\u017cemy przypisa\u0107 chocia\u017cby do delegaty, lub wywo\u0142a\u0107. Wywo\u0142anie wygl\u0105da nast\u0119puj\u0105co: \u201e() =&gt; { \/\/cia\u0142o funkcji }\u201d . Zapis w cudzys\u0142owie wygl\u0105da co najmniej strasznie, ale przyjrzyjmy si\u0119 tu bli\u017cej. Mamy w klamerkach cia\u0142o funkcji. Operator \u201e=&gt;\u201d zwraca funkcj\u0119 o ciele w klamerkach, przyjmuj\u0105cej parametry podane w nawiasie. Innym przyk\u0142adem u\u017cycia jest \u201ex =&gt; x * x\u201d. Wyra\u017cenie to mo\u017cemy przypisa\u0107 do delegaty (tzn typDelegaty Del = x =&gt; x * x i wywo\u0142a\u0107 w kodzie del(2); jak zwyk\u0142\u0105 funkcj\u0119, dostaniemy kwadrat liczby ), i przeczytaliby\u015bmy to \u201ex takie \u017ce x *x\u201d Opis wyra\u017ce\u0144 lambda (i programowania funkcyjnego) wychodzi daleko poza ramy tego artyku\u0142u \u2013 tutaj pokazano wy\u0142\u0105cznie u\u017cycie operatora.<br \/>\nPrzejd\u017amy do operator\u00f3w operuj\u0105cych nie tyle na warto\u015bciach, co na samych zmiennych i tego jak s\u0105 one reprezentowane. Zacznijmy od kropki ( \u201e.\u201d) b\u0119d\u0105cej operatorem wy\u0142uskania, tzn dost\u0119pu do elementu (np. funkcji, w\u0142asno\u015bci, warto\u015bci\u2026) obiektu jakiej\u015b klasy, enuma lub struktury. Przyk\u0142adem niech b\u0119dzie dzie\u0144.poniedzia\u0142ek, cz\u0142owiek.noga czy ekspres.zaparz_kawe(); . Kolejnym operatorem, jaki mo\u017cna do\u0142\u0105czy\u0107 do tej grupy, jest unarny operator \u201e&amp;\u201d, kt\u00f3ry zwraca adres tego, co wyst\u0119puje za nim, oraz \u201e*\u201d, kt\u00f3ry zwraca to, co znajduje si\u0119 pod adresem tego, co wyst\u0119puje za nim (dokonuje dereferencji). Oba mog\u0105 wyst\u0105pi\u0107 wy\u0142\u0105cznie w sekcji unsafe, gdzie mamy dost\u0119p do pami\u0119ci i mo\u017cemy u\u017cywa\u0107 jawnie wska\u017anik\u00f3w. Operatorem, kt\u00f3ry r\u00f3wnie\u017c jest zwi\u0105zany ze wska\u017anikami i jest u\u017cywany w sekcji unsafe, jest r\u00f3wnie\u017c \u201e-&gt;\u201d, kt\u00f3ry oznacza dobranie si\u0119 do sk\u0142adnika z\u0142o\u017conego obiektu, wskazywanego wska\u017anikiem. Wyra\u017cenie \u201ex-&gt;y\u201d jest r\u00f3wnoznaczne z \u201e(*x).y\u201d.<br \/>\nNajm\u0142odszy z operator\u00f3w &#8211; operator \u201eawait\u201d u\u0142atwia prac\u0119 z metodami asynchronicznymi (wydaje si\u0119 nam, jakby by\u0142y zwyk\u0142e). Z jednej strony aplikacja nam si\u0119 nie przycina (mul\u0105c\u0105 funkcj\u0119 wywo\u0142ali\u015bmy asynchronicznie), z drugiej za\u015b mo\u017cemy si\u0119 dobra\u0107 do tego co stoi za awaitem bez callback\u00f3w. U\u017cywany tylko w metodach oznaczonych s\u0142\u00f3wkiem async.<br \/>\nOperator new s\u0142u\u017cy do tworzenia nowego obiektu. Operator default zwraca warto\u015b\u0107 domy\u015bln\u0105 dla danego typu. Dla liczb b\u0119dzie to zero, dla obiektu null, dla boola false, dla typ\u00f3w generycznych pierwszy element. Operator checked sprawdza, czy aby przypadkiem nie dosz\u0142o do przepe\u0142nienia zmiennych, rzucaj\u0105c wyj\u0105tek typu System.OverflowException, je\u015bli to jednak mia\u0142o miejsce. Wy\u0142\u0105cza takie dzia\u0142anie operator unchecked. Je\u017celi zmienna si\u0119 przepe\u0142ni, zamiast du\u017cej liczby dodatniej, pojawi si\u0119 du\u017ca liczba ujemna (przekr\u0119ci si\u0119 licznik). Przy u\u017cyciu unchecked skompiluje si\u0119 nawet kod, gdzie do inta zapisujemy maxint + sta\u0142a (normalnie wyrzuci\u0142oby b\u0142\u0105d kompilacji).<br \/>\nOperator sizeof zwraca nam ilo\u015b\u0107 bajt\u00f3w zajmowanych przez dan\u0105 zmienn\u0105. Mo\u017ce przyj\u0105\u0107 za parametr typ, typ enum, wska\u017anik, struktur\u0119 (nie zawieraj\u0105c\u0105 zmiennych o typach referencyjnych) \u2013 Ma ono sens tylko w przypadku typ\u00f3w niezarz\u0105dzalnych.<br \/>\nOperator stackalloc s\u0142u\u017cy do alokacji miejsca na stosie w sekcji unsafe.<br \/>\nCiekawostk\u0105 jest, \u017ce w j\u0119zyku C# przecinek nie jest operatorem (mimo \u017ce jest dozwolone u\u017cycie go do rozdzielenia inicjalizacji). Zacytuj\u0119 dokumentacj\u0119: \u201eC# does not support the comma operator. It allows comma separated initialization for example inside a for statement (e.g. (for i = 0, j = 0; i &lt; foo.size(); i++) { &#8230; } but doesn&#8217;t consider the comma in this case to be an operator.\u201d Wydaje si\u0119 to logiczne. W przypadku C\/C++ jest on operatorem sekwencji. Nie pasuje on jednak do operator\u00f3w w rozumieniu nowoczesnych j\u0119zyk\u00f3w \u2013 rozdzielenie przecinkiem nie powoduje bowiem zwr\u00f3cenia warto\u015bci po wykonaniu danej operacji \u2013 czyli m\u00f3wi\u0105c pro\u015bciej \u2013 nic nie jest obliczane, nic nie jest tworzone, do \u017cadnej warto\u015bci si\u0119 nie dostajemy \u2013 s\u0142owem nie jest wykonywana \u017cadna operacja. Po prostu oddzielamy od siebie elementy. Przecinek jest wi\u0119c separatprem, nie operatorem.<\/p>\n<h1>Priorytety operator\u00f3w<\/h1>\n<p>Mamy nast\u0119puj\u0105ce grupy operator\u00f3w, od najwy\u017cszego priorytetu do najni\u017cszego. Je\u017celi priorytety wyst\u0119puj\u0105 w tej samej grupie (jak na przyk\u0142ad dodawanie i odejmowanie), wykonujemy je od lewej do prawej. W ka\u017cdej chwili mo\u017cemy wywo\u0142a\u0107 funkcj\u0119 GetPriority(\/\/tutaj co); aby sprawdzi\u0107 jaki priorytet ma dane dzia\u0142anie. Im ni\u017csza liczba, tym wy\u017cszy priorytet. 1. &#8222;.&#8221;, &#8222;-&gt;&#8221;, &#8222;() &#8211; jako wywo\u0142anie funkcji&#8221;, &#8222;[]&#8221;, &#8222;++&#8221; &#8211; dla x++, &#8222;&#8211;&#8222;, &#8222;new&#8221;, &#8222;stackalloc&#8221; (przydzia\u0142 na stosie)&#8221;, &#8222;typeof&#8221;, &#8222;checked&#8221;, &#8222;unchecked&#8221;, &#8222;default&#8221;, &#8222;await&#8221;<br \/>\n2. &#8222;sizeof&#8221;, &#8222;+&#8221; , &#8222;-&#8221; \u2013 ten od zmiany znaku, &#8222;!&#8221;, &#8222;~&#8221;, &#8222;()&#8221;- jako rzutowanie, ++ &#8211; dla ++x, &#8222;*&#8221;- dla wy\u0142uskania, &#8222;&amp;&#8221; &#8211; dla dereferencji<br \/>\n3. &#8222;*&#8221;, &#8222;\/&#8221;, &#8222;%&#8221;<br \/>\n4. &#8222;+&#8221;, &#8222;-&#8221;<br \/>\n5. &#8222;&lt;&lt;&#8222;, &#8222;&gt;&gt;&#8221;<br \/>\n6. &#8222;&lt;&#8222;, &#8222;&gt;&#8221;, &#8222;&lt;=&#8221;, &#8222;&gt;=, &#8222;is&#8221;, as&#8221;<br \/>\n7. &#8222;==&#8221;, &#8222;!=&#8221;<br \/>\n8. &#8222;&amp;&#8221; &#8211; dla and<br \/>\n9. &#8222;^&#8221;<br \/>\n10. &#8222;|&#8221;<br \/>\n11. &#8222;&amp;&amp;&#8221;<br \/>\n12. &#8222;||&#8221;<br \/>\n13. &#8222;?:&#8221;,<br \/>\n14. &#8222;=&#8221;, &#8222;*=&#8221;, &#8222;\/=&#8221;, &#8222;+=&#8221;, &#8222;-=&#8221;, &#8222;&lt;&lt;=&#8221;, &#8222;&gt;&gt;=&#8221;, &#8222;&amp;=&#8221;, &#8222;^=&#8221;, &#8222;|=&#8221;, &#8222;??&#8221;, &#8222;=&gt;&#8221;<\/p>\n<h1>\u0141\u0105czenie i przeci\u0105\u017canie operator\u00f3w<\/h1>\n<p>Wi\u0119kszo\u015b\u0107 operator\u00f3w dwuargumentowych (poza operatorami przypisania, operatorem &#8222;??&#8221; i &#8222;=&gt;&#8221;) jest \u0142\u0105czona lewostronnie (tzn od lewej do prawej). Operatory przypisania, operator alternatywy dla nulla (??) oraz lambda (=&gt;) prawostronnie (tzn od prawej do lewej, niejako od ty\u0142u).<br \/>\nOperatory s\u0105 zdefiniowane dla klas wbudowanych \u2013 w ko\u0144cu kompilator nie wie co ma dosta\u0107 w wyniku dodania np. dw\u00f3ch obiekt\u00f3w klasy reprezentuj\u0105cych ksi\u0105\u017ck\u0119. Je\u015bli chcemy, mo\u017cemy napisa\u0107 w\u0142asne zachowanie dla nast\u0119puj\u0105cych operator\u00f3w: &#8222;++&#8221;, &#8222;&#8211;&#8222;, &#8222;+&#8221;, &#8222;-&#8222;, &#8222;!&#8221;, &#8222;~&#8221;, &#8222;*&#8221;, &#8222;\/&#8221;, &#8222;%&#8221;, &#8222;&lt;&lt;&#8222;, &#8222;&gt;&gt;&#8221;, &#8222;&lt;&#8222;, &#8222;&gt;&#8221;, &#8222;&lt;=&#8221;, &#8222;&gt;=&#8221;, &#8222;==&#8221;, &#8222;!=&#8221;, &#8222;&amp;&#8221;, &#8222;|&#8221;, &#8222;^&#8221;, \u201etrue\u201d, \u201efalse\u201d (przy czym 2 ostatnie wyst\u0119puj\u0105 wy\u0142\u0105cznie jako operatory prze\u0142adowane). Przyk\u0142ad to<\/p>\n<pre class=\"brush: csharp; collapse: false\"> public static Klasa operator +(Klasa prawy,Klasa lewy)\r\n{\r\n    return new klasa(prawy.wartosc + lewy.wartosc);\r\n}<\/pre>\n<p>Mo\u017cemy przeci\u0105\u017cy\u0107 r\u00f3wnie\u017c operator \u201e[]\u201d, ale do tego musimy u\u017cy\u0107 indekser\u00f3w (zainteresowani mog\u0105 o nich poczyta\u0107 w sieci \u2013 jako zadanie domowe).<\/p>\n<h1>Podsumowanie<\/h1>\n<p>W powy\u017cszym artykule zosta\u0142y przybli\u017cone informacje na temat operator\u00f3w w j\u0119zyku C#. Przedstawiono znaczenie ka\u017cdego z symboli, priorytety operator\u00f3w, oraz mo\u017cliwo\u015bci ich \u0142\u0105czenia, przeci\u0105\u017cania.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Artyku\u0142 zg\u0142oszony do konkursu na stronie\u00a0http:\/\/strefainzyniera.pl Wst\u0119p Wi\u0119kszo\u015b\u0107 oprogramowania, jakie przyjdzie nam pisa\u0107, b\u0119dzie wymaga\u0142a u\u017cycia operator\u00f3w. I nie m\u00f3wi\u0119 tu wy\u0142\u0105cznie o operatorach znanych<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/piatkosia.k4be.pl\/wordpress\/2014\/01\/05\/655\/\">Lecim dalej<span class=\"screen-reader-text\">[C#] Operatory<\/span> <i class=\"fas fa-angle-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83],"tags":[142,91],"class_list":["post-655","post","type-post","status-publish","format-standard","hentry","category-c_sharp","tag-csharp","tag-operatory","entry"],"_links":{"self":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=655"}],"version-history":[{"count":7,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/655\/revisions"}],"predecessor-version":[{"id":668,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/655\/revisions\/668"}],"wp:attachment":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}