<?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></title>
	<atom:link href="https://blog.macmichal2.pl/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.macmichal2.pl</link>
	<description>Blog poświęcony inżynierii oprogramowania, C#/.Net i T-SQLowi</description>
	<lastBuildDate>Sun, 10 May 2020 19:29:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>DDD konwersacja</title>
		<link>https://blog.macmichal2.pl/ddd-konwersacja/</link>
					<comments>https://blog.macmichal2.pl/ddd-konwersacja/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Tue, 08 Oct 2013 14:08:57 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[DDD]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=521</guid>

					<description><![CDATA[Ostatnio nawiązała się ciekawa wymiana zdań odnośnie projektu CQRS Sample. Zapraszam na forum.]]></description>
										<content:encoded><![CDATA[<p>Ostatnio nawiązała się ciekawa wymiana zdań odnośnie projektu <a href="http://cqrssample.codeplex.com" title="CQRS Sample" target="_blank">CQRS Sample</a>.<br />
Zapraszam na <a href="https://groups.google.com/forum/#!topic/ddd-cqrs-sample/EUkH-pAnc9U" title="forum" target="_blank">forum</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/ddd-konwersacja/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PLSSUG Kraków &#8211; Metody dostępu w SQL Serverze</title>
		<link>https://blog.macmichal2.pl/metody-dostepu-w-sql-serverze/</link>
					<comments>https://blog.macmichal2.pl/metody-dostepu-w-sql-serverze/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Fri, 26 Apr 2013 07:45:39 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=515</guid>

					<description><![CDATA[Zapraszam już w najbliższy poniedziałek na moją kolejną sesję poświęconą przetwarzaniu zapytań przez SQL Servera. UPDATE: Start godzina 18.00. 22 kwietnia, poniedziałek 18:00 – 19:00 &#124; Metody dostępu w SQL Serverze &#124; Michał Mac Gdzie i jak baza danych przechowuje dane? Jakie są strategie pobierania danych? Dlaczego serwer wybrał tą metodę, a nie inną? Na [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Zapraszam już w najbliższy poniedziałek na moją kolejną sesję poświęconą przetwarzaniu zapytań przez SQL Servera.</p>
<p><b>UPDATE</b>: Start godzina 18.00.</p>
<p><a href="http://plssug.org.pl/2013/04/33-spotkanie-plssug-krakow/" target="_blank"><img decoding="async" src="https://blog.macmichal.pl/wp-content/blogs.dir/4/files/2013/02/plssug.png"  width="125" height="125" alt="PLSSUG" class="frame_left" /></a><br />
<b>22 kwietnia, poniedziałek<br />
18:00 – 19:00 | Metody dostępu w SQL Serverze | Michał Mac</b><br />
Gdzie i jak baza danych przechowuje dane? Jakie są strategie pobierania danych? Dlaczego serwer wybrał tą metodę, a nie inną? Na jakiej podstawie to zrobił? Która metoda dostępu jest szybsza i dlaczego? Jak działają indeksy?</p>
<p><b>MIEJSCE:</b><br />
Wyższa Szkoła Zarządzania i Bankowości w Krakowie, Al. Kijowska 14, 6K (parter)</p>
<p>Więcej szczegółów można znaleźć na stronie <a href="http://plssug.org.pl/2013/04/33-spotkanie-plssug-krakow/">PLSSUG</a>.</p>
<p>Zapraszam.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/metody-dostepu-w-sql-serverze/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EventBroker w JavaScript</title>
		<link>https://blog.macmichal2.pl/eventbroker-javascript/</link>
					<comments>https://blog.macmichal2.pl/eventbroker-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Mon, 15 Apr 2013 18:28:36 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Wzorce]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=506</guid>

					<description><![CDATA[Wyobraźmy sobie kompozytowy ekran, na którym widnieje lista dostępnych do kupna produktów. Użytkownik po dodaniu jednego z nich do koszyka dostanie informację o wykonanej akcji (np. animowana notyfikacja), a w innym miejscu interfejsu komponent wyświetlający stan koszyka zostanie odświeżony. Powyższy scenariusz można rozwiązać z użyciem wzorca EventBroker (więcej w najnowszym numerze programisty). Implementacja wspomnianego wzorca [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Wyobraźmy sobie kompozytowy ekran, na którym widnieje lista dostępnych do kupna produktów. Użytkownik po dodaniu jednego z nich do koszyka dostanie informację o wykonanej akcji (np. animowana notyfikacja), a w innym miejscu interfejsu komponent wyświetlający stan koszyka zostanie odświeżony.<br />
Powyższy scenariusz można rozwiązać z użyciem wzorca EventBroker (więcej w najnowszym numerze programisty).</p>
<p>Implementacja wspomnianego wzorca w JS jest bardzo krótka i prosta.</p>
<pre class="brush: js">
function EventBroker() {
    var self = this;
    self.list = [];

    this.subscribe = function(event, handler) {
        if (!self.list[event])
            self.list[event] = [];

        self.list[event].push(handler);
    }

    this.publish = function(event, data) {
        if (self.list[event]) {
            for( var n in self.list[event] ) {
                self.list[event][n](data);
            }
        }
    };
}
</pre>
<p>Publikator (fasada odpalająca akcje dodaj) publikuje zdarzenie, a subskrybent (widget koszyka) na nie oczekuje i odświeża swój stan.</p>
<p>Przykład można znaleźć <a href="http://macmichal.pl/samples/EventBroker.html" target="_blank">tutaj</a>.  Otwórz źródło strony, by zobaczyć szczegóły implementacji i interakcję.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/eventbroker-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Server Optymalizacja &#8211; nagranie</title>
		<link>https://blog.macmichal2.pl/sql-server-optymalizacja-nagranie/</link>
					<comments>https://blog.macmichal2.pl/sql-server-optymalizacja-nagranie/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Tue, 26 Mar 2013 19:23:18 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=492</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<p><iframe width="590" height="415" src="//www.youtube.com/embed/1bNjEDNpe6M?wmode=transparent" frameborder="0"></iframe></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/sql-server-optymalizacja-nagranie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Domain Specific Language &#8211; materiały z 42. spotkania TGD.NET</title>
		<link>https://blog.macmichal2.pl/domain-specific-language-42-spotkanie-tgd-net/</link>
					<comments>https://blog.macmichal2.pl/domain-specific-language-42-spotkanie-tgd-net/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Sun, 24 Mar 2013 18:08:25 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[BFsharp]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[SaaS]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=497</guid>

					<description><![CDATA[Poniżesz można ściągnąć materiały z 42. spotkania TGD.NET Prezentacja Przykłady BFsharp]]></description>
										<content:encoded><![CDATA[<p>Poniżesz można ściągnąć materiały z 42. spotkania TGD.NET</p>
<p><a href="http://macmichal.pl/materialy/DSL.TGD.Net.ppt" target="_blank">Prezentacja</a><br />
<a href="http://dsl.codeplex.com" target="_blank">Przykłady</a><br />
<a href="http://bfsharp.codeplex.com" target="_blank">BFsharp</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/domain-specific-language-42-spotkanie-tgd-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PLSSUG Kraków &#8211; Sesja Optymalizacja zapytań w SQL Server</title>
		<link>https://blog.macmichal2.pl/plssug-optymalizacja-zapytan-sql-sesja/</link>
					<comments>https://blog.macmichal2.pl/plssug-optymalizacja-zapytan-sql-sesja/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Fri, 08 Feb 2013 16:12:51 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=479</guid>

					<description><![CDATA[Zapraszam już w najbliższą środę na moją sesję poświęconą przetwarzaniu zapytań przez SQL Servera. 13 lutego, środa 18:00 – 19:00 &#124; Optymalizacja zapytań w SQL Server &#124; Michał Mac Prezentacja będzie poświęcona różnym technikom, które pozwalają odpowiedzieć na pytanie, czy dane zapytanie jest wydajne. Co jest problemem? Jak czytać fizyczne plany zapytań? Jak porównać wydajność [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Zapraszam już w najbliższą środę na moją sesję poświęconą przetwarzaniu zapytań przez SQL Servera.</p>
<p><a href="https://plssug.org.pl/2013/02/32-spotkanie-plssug-krakow/" target="_blank"><img decoding="async" src="https://blog.macmichal.pl/wp-content/blogs.dir/4/files/2013/02/plssug.png"  width="125" height="125" alt="PLSSUG" class="frame_left" /></a><br />
<b>13 lutego, środa<br />
18:00 – 19:00 | Optymalizacja zapytań w SQL Server | Michał Mac</b><br />
Prezentacja będzie poświęcona różnym technikom, które pozwalają odpowiedzieć na pytanie, czy dane zapytanie jest wydajne. Co jest problemem? Jak czytać fizyczne plany zapytań? Jak porównać wydajność dwóch zapytań? Jakie są często spotykane problemy? Jak wykorzystać row_number oraz inne sposoby w celu poprawy wydajności? Podczas sesji zostaną zaprezentowane konkretne problemy, które będziemy rozwiązywali.</p>
<p><b>MIEJSCE:</b><br />
Wyższa Szkoła Zarządzania i Bankowości w Krakowie, Al. Kijowska 14, 6K (parter)</p>
<p>Więcej szczegółów można znaleźć na stronie <a href="http://plssug.org.pl/2013/02/32-spotkanie-plssug-krakow/">PLSSUG</a>.</p>
<p>Zapraszam.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/plssug-optymalizacja-zapytan-sql-sesja/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dlaczego singleton jest zły?</title>
		<link>https://blog.macmichal2.pl/dlaczego-singleton-jest-zly/</link>
					<comments>https://blog.macmichal2.pl/dlaczego-singleton-jest-zly/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Fri, 18 Jan 2013 09:45:46 +0000</pubDate>
				<category><![CDATA[Wzorce]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=472</guid>

					<description><![CDATA[Singleton jest jednym z dobrze znanych i często stosowanych antywzorców. Zacznijmy od razu od poniższego przykładu: Jeśli mielibyśmy napisać unit test, to jak to zrobić? Jak wytestować w izolacji klasę procesora? Można sobie wyobrazić, że ustawienia czytają jakiś plik z dysku, a logger zapisuje. Jest bardzo trudno zestawić łatwo i szybko takie środowisko. Jeśli tak [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Singleton jest jednym z dobrze znanych i często stosowanych antywzorców. Zacznijmy od razu od poniższego przykładu:</p>
<pre class="brush: csharp">
public class OrderProcessor
{
    public void Process(Order order)
    {
        // Validate
        // Do some work
        if ( Settings.Instance.ShouldLog )
            Logger.Instance.Log("Order id=5 processed successfully");
    }
}
</pre>
<p>Jeśli mielibyśmy napisać unit test, to jak to zrobić?<br />
Jak wytestować w izolacji klasę procesora?</p>
<p>Można sobie wyobrazić, że ustawienia czytają jakiś plik z dysku, a logger zapisuje.<br />
Jest bardzo trudno zestawić łatwo i szybko takie środowisko. Jeśli tak będzie to szybko przestanie nam się chcieć pisać testy.</p>
<p>Więcej na ten i powiązane tematy można znaleźć w najnowszym artykule w <a href="http://programistamag.pl">Programiście</a>. Polecam.</p>
<p><a href="http://programistamag.pl" target="_blank"><img loading="lazy" decoding="async" src="https://blog.macmichal.pl/wp-content/blogs.dir/4/files/2013/01/programista.jpg"  width="160" height="226" alt="Programista" class="frame_left" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/dlaczego-singleton-jest-zly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>IDisposable, cz 1. &#8211; C# pod lupą</title>
		<link>https://blog.macmichal2.pl/idisposable-cz-1-csharp-pod-lupa/</link>
					<comments>https://blog.macmichal2.pl/idisposable-cz-1-csharp-pod-lupa/#comments</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Wed, 16 Jan 2013 10:27:01 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=470</guid>

					<description><![CDATA[To będzie pierwszy wpis na temat interfejsu IDisposable w tej krótkiej mini serii z większej serii. Otóż dobry programista używający jakiegokolwiek obiektu, który implementuje interfejs IDisposable jest zobowiązany do wywołania metody Dispose w momencie gdy skończy pracować z daną instancją klasy. Spowoduje to zwolnienie zasobów przez wykorzystywany obiekt, np. zwrócenie połączenia bazodanowego do puli połączeń, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>To będzie pierwszy wpis na temat interfejsu IDisposable w tej krótkiej mini serii z większej serii.</p>
<p>Otóż dobry programista używający jakiegokolwiek obiektu, który implementuje interfejs IDisposable jest zobowiązany do wywołania metody Dispose w momencie gdy skończy pracować z daną instancją klasy. Spowoduje to zwolnienie zasobów przez wykorzystywany obiekt, np. zwrócenie połączenia bazodanowego do puli połączeń, rozłączenie połączenia tcp/ip, zwolnienie jakiegoś niezarządzalnego zasobu czy zwolnienie dużej wewnętrznej struktury.</p>
<p>W bazowym frameworku .Neta niestety możemy spotkać kilka niekonsekwentnych i problematycznych implementacji. Przyjęło się poprzez konwencję, że na niektórych klasach ( np. FileStream ) dostępne są dwie metody: Close i Dispose. Czym one się różnią? Otóż dokładnie niczym. </p>
<pre class="brush: csharp">
public virtual void Close()
{
  this.Dispose(true);
  GC.SuppressFinalize((object) this);
}

[__DynamicallyInvokable]
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public void Dispose()
{
  this.Close();
}
</pre>
<p>Zatem czy jest różnica, którą metodę można wołać?<br />
Tak, jest.<br />
Jeśli napiszemy kod, który będzie przypominał poniższy to mamy duży problem. Jaki?</p>
<pre class="brush: csharp">
FileStream file = File.Open("processMe.txt", FileMode.Open);

// Process file here

file.Close();
</pre>
<p>Otóż w momencie gdy w bloku procesującym poleci wyjątek to metoda Close nie zostanie wywołana i co za tym idzie plik nie zostanie zwolniony. Sam .Net w późniejszym czasie to naprawi (tak, by nie było wycieków niezarządalnych zasobów) poprzez finalizator (o ile jest zaimplementowany). Jednak jest to niedeterministyczne zachowanie na którym polegać nie wolno. Każdemu dobremu programiście nie przytrafi się taka sytuacja, gdyż wie, że należy obiekty implementujące interfejs IDisposable używać wraz z klauzulą using.</p>
<pre class="brush: csharp">
using(FileStream f = File.Open("processMe.txt", FileMode.Open))
{
    // Process file here
}
</pre>
<p>Jeżeli popatrzymy sobie do disassemblera to zobaczymy jak powyższa konstrukcja jest rozwijana.<br />
Dostrzeżemy tam użycie metody Dispose oraz bloku try finally. W momencie gdy poleci wyjątek blok obsługi błędów wykona sprzątanie zasobów i wszystko będzie w porządku. </p>
<p>Powyższy kod otworzony w Reflectorze z wyłączonymi optymalizacjami zostanie zdekompilowany do następującej postaci:</p>
<pre class="brush: csharp">
    FileStream f;
    bool CS$4$0000;
    f = File.Open("processMe.txt", 3);
Label_000D:
    try
    {
        goto Label_0021;
    }
    finally
    {
    Label_0011:
        if ((f == null) != null)
        {
            goto Label_0020;
        }
        f.Dispose();
    Label_0020:;
    }
Label_0021:
    return;
</pre>
<p>Co ciekawe są w .Netcie klasy, które implementują interfejs IDisosable w sposób explicit. Oznacza to, że metoda Dispose nie będzie normalnie widoczna w IntelliSense uniemożliwiając nam szybkie stwierdzenie, czy klasa implementuje wspomniany interfejs i użycie using. W takich przypadkach ja od razu pisz using, a kompilator mi powie, czy jest tam implementacja IDisposable.</p>
<p>Jakie to klasy?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/idisposable-cz-1-csharp-pod-lupa/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio Achievements</title>
		<link>https://blog.macmichal2.pl/visual-studio-achievements/</link>
					<comments>https://blog.macmichal2.pl/visual-studio-achievements/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Wed, 05 Dec 2012 09:39:58 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=458</guid>

					<description><![CDATA[Bardzo fajny dodatek do VS: Visual Studio Achievements Zbieramy punkty za konkretne konstrukcje i pisany kod. Programowanie będzie teraz jak granie na komputerze. Przykłady poniżej.]]></description>
										<content:encoded><![CDATA[<p>Bardzo fajny dodatek do VS: <a href="http://channel9.msdn.com/achievements/" title="Visual Studio Achievements">Visual Studio Achievements</a><br />
Zbieramy punkty za konkretne konstrukcje i pisany kod. Programowanie będzie teraz jak granie na komputerze. Przykłady poniżej.</p>
<p><a href="https://blog.macmichal.pl/files/2012/12/achievements.png" target="_self" title="" rel="prettyPhoto"><span class="frame_left preload"><img loading="lazy" decoding="async" src="https://blog.macmichal.pl/files/2012/12/achievements.png"  width="404" height="189" alt="Visual Studio Achievements" /></span></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/visual-studio-achievements/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>is vs as &#8211; C# pod lupą</title>
		<link>https://blog.macmichal2.pl/is-vs-as-csharp-pod-lupa/</link>
					<comments>https://blog.macmichal2.pl/is-vs-as-csharp-pod-lupa/#respond</comments>
		
		<dc:creator><![CDATA[Michał Mac]]></dc:creator>
		<pubDate>Fri, 09 Nov 2012 10:20:52 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">http://blog.macmichal.pl/?p=445</guid>

					<description><![CDATA[Dziś zajmiemy się operatorami związanym z rzutowaniem typów. W przykładach będziemy używać następującej hierarchii: Operator is służy do sprawdzenia, czy dany obiekt jest konkretnego typu, bądź czy implementuje wskazany interfejs. Natomiast operator as rzutuje dane obiekt o ile jest on określonego typu, w przeciwnym wypadku zwraca null. Tutaj warto zauważyć, że możemy tylko rzutować na [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Dziś zajmiemy się operatorami związanym z rzutowaniem typów. W przykładach będziemy używać następującej hierarchii:</p>
<pre class="brush: csharp">
public class Animal { }
    
public interface IMammal { }

public class Tiger : Animal, IMammal { }
</pre>
<p>Operator <b>is</b> służy do sprawdzenia, czy dany obiekt jest konkretnego typu, bądź czy implementuje wskazany interfejs.</p>
<pre class="brush: csharp">
object tiger = new Tiger();

if ( tiger is Animal)
{
    Animal animal = (Animal) tiger;
}

if ( tiger is IMammal)
{
    IMammal mammal = (IMammal) tiger;
}
</pre>
<p>Natomiast operator <b>as</b> rzutuje dane obiekt o ile jest on określonego typu, w przeciwnym wypadku zwraca null. Tutaj warto zauważyć, że możemy tylko rzutować na typy, które są nullowalne &#8211; nie możemy używać struktur (value type&#8217;ów).</p>
<pre class="brush: csharp">
object tiger = new Tiger();
Animal animal2 = tiger as Animal;
if ( animal2 != null)
{
    // Do something
}

IMammal mammal2 = tiger as IMammal;
if (mammal2 != null)
{
    // Do something
}
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.macmichal2.pl/is-vs-as-csharp-pod-lupa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
