<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty &#187; beginning c#</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/beginning-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Wed, 28 Dec 2011 23:52:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>.NET słowa kluczowe out,ref</title>
		<link>http://piotr.doniec.eu/devlog/2010/05/net-slowa-kluczowe-outref/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/05/net-slowa-kluczowe-outref/#comments</comments>
		<pubDate>Sat, 08 May 2010 10:24:32 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C#/.NET]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[beginning c#]]></category>
		<category><![CDATA[keywords]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=490</guid>
		<description><![CDATA[Znalazłem ostatnio trochę czasu aby dokładniej przyjrzeć się .NET i na własnej skórze przekonać się czy jest warty więcej niż Java. Dotąd napisałem tylko dwa proste programik wykorzystują tę platformę &#8211; aplikację MDI obsługująca skromną bazę danych przechowującą informację o osobach opartą na plikach binarnych, oraz obsługę portu rs232. Pamiętam że sposób programowania nie powalił [...]]]></description>
			<content:encoded><![CDATA[<p>Znalazłem ostatnio trochę czasu aby dokładniej przyjrzeć się  .NET i na własnej skórze przekonać się czy jest warty więcej niż Java. Dotąd napisałem tylko dwa proste programik wykorzystują tę platformę &#8211; aplikację MDI obsługująca skromną bazę danych przechowującą informację o osobach opartą na plikach binarnych, oraz obsługę portu rs232. Pamiętam że sposób programowania nie powalił mnie wtedy na kolana, przypominało to raczej tylko trochę uproszczone C++. Oczywiście skorzystałem z całkiem fajnego mechanizmu właściwości(properties) i upraszczającej życie pętli foreach, stworzyłem nawet własną kontrolkę, ale wszystko to było robione w pośpiechu i nie pozwoliło wniknąć głębiej. Teraz postanowiłem nadrobić zaległości i jestem mile zaskoczony.<br />
<span id="more-490"></span><br />
To co tak naprawdę skłoniło mnie do wypożyczenia książki i studiowania jej od samego początku to możliwość łączenia kodu napisanego w C++(/CLI) z kodem zarządzanym napisanym w .NET. Miło jest móc połączyć wysokopoziomowe programowanie logiki aplikacji z niskopoziomowym dostępem do funkcji systemu operacyjnego Windows takich jak dostęp do kamery czy przechwytywanie komunikatów.<br />
Ponieważ książkę czytam od deski, zostałem zmuszony do przypomnienia podstawowych konstrukcji programistycznych takich jak metody czy proste klasy, ale poznałem przy tym kilka ciekawych słów kluczowych umożliwiających kontrolowanie modyfikacji danych.</p>
<p><strong>Modyfikator out</strong><br />
Modyfikatorem out można oznaczyć dowolną liczbę parametrów metody. Nie ma przy tym znaczenia kolejność, parametry zmodyfikowane przez out mogą wystąpić zarówno na początku listy w środku jak i na końcu. To słowo kluczowe definiuje tzw. parametr wyjściowy. Wykonanie funkcji wymaga zapisania wartości do parametru wyjściowego. </p>
<pre class="brush: csharp">
        public static void Dodawanie(out int sum, int x, int y, out int ssum)
        {
            sum = x + y;
            ssum = sum * sum;
        }
</pre>
<p>Jeśli kompilator nie znajdzie prawidłowego(co można wymusić komentując linię ssum = sum*sum) przypisania wygeneruje błąd i poinformuje nas o tym komunikatem: </p>
<blockquote><p>&#8222;The out parameter &#8216;ssum&#8217; must be assigned to before control leaves the current method&#8221;</p></blockquote>
<p>Modyfikator out, może trochę przypominać mechanizm znany z C polegający na przekazywaniu wskaźnika jako parametru funkcji. Jednak w przypadku C# mamy pewność że po wykonaniu podprogramu, w parametrze wyjściowym znajdzie się jakąś wartość, co chroni nas przed nieprzyjemnym komunikatem <em>&#8222;Segmentation fault&#8221;</em>. Istnieje jeszcze jedna różnica wpływająca na korzyść platformy .NET, mianowicie sposób wywołania. Nie ma tu magicznych zaklęć nie trzeba się domyślać który parametr to wskaźnik i jak został przekazany, ponieważ trzeba to jawnie określić. Kompilator umożliwi uruchomienie programu tylko wtedy gdy wszystkie wywołania funkcji zostaną opisane zgodnie z ich deklaracjami/definicjami, znakomicie wpływa to na czytelność kodu:</p>
<pre class="brush: csharp">
        static void Main(string[] args)
        {
            int sum, ssum;
            int a = 5, b = 6;

            Dodawanie(out sum, a, b, ssum);       // FAIL !
            Dodawanie(out sum, a, b, out ssum); // OK !

            Console.WriteLine(&quot;Suma {0} + {1} = {2}, ({0} + {1})^2 = {3}&quot;, a, b, sum, ssum);
            Console.ReadLine();
        }
</pre>
<p><strong>Modyfikator ref</strong><br />
Działanie modyfikatora ref również jest związane z wywołaniem metod. Jednakże jego zastosowanie ma sens tylko w odniesieniu do obiektów które w łańcuchu dziedziczenia nie mają klasy System.ValueType, a więc takich które tworzone są na stercie i nie są przekazywane przez wartość ale przez referencję. Podobnie jak w przypadku Javy, modyfikacje wykonane na takim obiekcie pozostają aktualne po zakończeniu metody, o czym napisałem we wpisie <a href="http://piotr.doniec.eu/devlog/2009/03/pass-by-value-w-javie/">Pass-by-value w javie</a>. Dla przypomnienia: tak naprawdę przekazywana jest nie referencja a jej kopia, z tego powodu dozwolona jest zmiana stanu obiektu ale przypisanie referencji do innego obiektu już nie. Aby lepiej zrozumieć zagadnienie przedstawiam prosty przykład prezentujący wspomnianą funkcjonalność:</p>
<pre class="brush: csharp">
class Punkt
{
  public int x;
  public int y;
}

class Program
{

  public static void CopyReference(Punkt p)
  {
    p.x = 0;
    p.y = 0;

    p = new Punkt();
    p.x = 200;
    p.y = 200;
  }

static void Main(string[] args)
{
  Punkt p1 = new Punkt();
  p1.y = 100;
  p1.x = 100;

  Console.WriteLine(&quot;Przed wykonaniem CopyReference: p1.x = {0}, p1.y = {1}&quot;, p1.x, p1.y);
  CopyReference(p1);
  Console.WriteLine(&quot;Po wykonaniem CopyReference: p1.x = {0}, p1.y = {1}&quot;;, p1.x, p1.y);
  Console.ReadLine();

  }
}
</pre>
<p>W wyniku wykonania programu powinniśmy zobaczyć na ekranie następujący wynik:</p>
<blockquote><p>
Przed wykonaniem CopyReference: p1.x = 100, p1.y = 100<br />
Po wykonaniem CopyReference: p1.x = 0, p1.y = 0
</p></blockquote>
<p>Aby osiągnąć zamierzone działanie wystarczy dodać modyfikator ref, zarówno do definicji metody, jak i do jej wywołania pdobnie jak ma to miejsce w przypadku &#8222;out&#8221;:</p>
<pre class="brush: csharp">
public static void OrigReference(ref Punkt p)
{
  p.x = 0;
  p.y = 0;

  p = new Punkt();
  p.x = 200;
  p.y = 200;
}
</pre>
<p>Po wykonaniu tak zmodyfikowanej metody, pola x oraz y obiektu p1 będą przechowywały wartość (200, 200)<br />
AFAIK w Javie takich możliwości nie ma, może konstrukcje takie nie są szczególnie przydatne, ale w .NET w razie czego są i można je wykorzystać co pozytywnie wpływa na moja dotychczasową ocenę tej platformy.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/05/net-slowa-kluczowe-outref/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

