<?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>Blog de Gilles TOURREAU</title>
	<atom:link href="http://gilles.tourreau.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://gilles.tourreau.fr</link>
	<description>MVP C# - .NET Framework, C#, VB, Visual Studio, Linq, ...</description>
	<lastBuildDate>Mon, 02 Jan 2012 23:44:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[Moi] Encore une nouvelle fois nominé MVP C#</title>
		<link>http://gilles.tourreau.fr/non-classe/moi-encore-une-nouvelle-fois-nomine-mvp-csharp.html</link>
		<comments>http://gilles.tourreau.fr/non-classe/moi-encore-une-nouvelle-fois-nomine-mvp-csharp.html#comments</comments>
		<pubDate>Mon, 02 Jan 2012 23:40:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVP]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/?p=631</guid>
		<description><![CDATA[Pour la 5ème fois, je viens d’être nominé MVP C# ! Cette récompense est le résultat de mon implication dans la communauté Microsoft (TechDays, Blog et Forums MSDN). Cette année je continuerai mon implication dans les forums MSDN et j’essayerai de publier beaucoup plus d’article sur mon blog !]]></description>
			<content:encoded><![CDATA[<p>Pour la 5ème fois, je viens d’être nominé MVP C# ! Cette récompense est le résultat de mon implication dans la communauté Microsoft (TechDays, Blog et Forums MSDN).</p>
<p align="center"><a href="http://gilles.tourreau.fr/wp-content/uploads/2012/01/mvp_vertical7.png"><img style="background-image: none; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="mvp_vertical7" src="http://gilles.tourreau.fr/wp-content/uploads/2012/01/mvp_vertical7_thumb.png" alt="mvp_vertical7" width="99" height="154" border="0" /></a></p>
<p>Cette année je continuerai mon implication dans les forums MSDN et j’essayerai de publier beaucoup plus d’article sur mon blog !</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/non-classe/moi-encore-une-nouvelle-fois-nomine-mvp-csharp.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[.NET] Code Contracts &#8211; Partie 4 &#8211; Les invariants</title>
		<link>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie-4-les-invariants.html</link>
		<comments>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie-4-les-invariants.html#comments</comments>
		<pubDate>Sun, 20 Nov 2011 22:05:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Contracts]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/?p=618</guid>
		<description><![CDATA[Nous avons vu précédemment comment définir des post-conditions à l’aide de Code Contracts. Nous allons voir maintenant comment définir des invariants à l’aide de Code Contracts. Ce post fait partie d’une série de post consacré à Code Contracts : Partie 01 &#8211; Introduction Partie 02 – Les pré-conditions Partie 03 – Les post-conditions Partie 04 [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons vu précédemment comment <a title="Code Contracts - Partie 3 - Les post-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">définir des post-conditions à l’aide de Code Contracts</a>. Nous allons voir maintenant comment définir des invariants à l’aide de Code Contracts.</p>
<p><span id="more-618"></span>Ce post fait partie d’une série de post consacré à Code Contracts :
<ul>
<li><a title="Code Contracts - Partie 01 - Introduction" href="http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html" target="_blank">Partie 01 &#8211; Introduction</a> </li>
<li><a title="Partie 02 – Les pré-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">Partie 02 – Les pré-conditions</a> </li>
<li><a title="Code Contracts - Partie 03 – Les post-conditions" href="http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-3-les-post-conditions.html" target="_blank">Partie 03 – Les post-conditions</a> </li>
<li><strong>Partie 04 – Les invariants</strong> </li>
</ul>
<h3>Qu’est ce qu’un invariant ?</h3>
<p>Un invariant est contrat qui doit toujours être vérifié durant la vie d’un objet. On utilise le plus souvent les invariants pour valider constamment la validité d’une propriété publique d’une classe.</p>
<p>Comme pour les post-conditions, les invariants permettent de “rassurer” un intégrateur qu’une condition sur une propriété sera toujours vérifiée après chaque appel à une méthode ou getter/setter d’une propriété “publique” de la classe (publique pour l’intégrateur, cela peut donc être les méthodes et propriétés <strong><span style="color: #0000ff">public</span></strong> ou <strong><span style="color: #0000ff">protected</span></strong>).</p>
<h3>Comment définir un invariant ?</h3>
<p>Pour définir un invariant, il faut créer une méthode <strong>privée</strong> marquée de l’attribut ContractInvariantMethodAttribute qui contiendra les différents contrats (invariants). Pour spécifier un invariant, il faut utiliser la méthode Contract.Invariant() et spécifier une condition qui devra toujours être vérifiée.</p>
<p>L’exemple suivant illustre la définition d’un invariant sur la classe <em>CompteBancaire</em> afin que le Solde soit toujours supérieur à 0.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:49e09da5-e947-41ef-b317-c123841b3af9" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
public class CompteBancaire
{
    public decimal Solde
    {
        get;
        private set;
    }

    public void Créditer(decimal montant)
    {
        this.Solde += montant;
    }

    public void Débiter(decimal montant)
    {
        this.Solde -= montant;
    }

    [ContractInvariantMethod]
    private void MonInvariant()
    {
        Contract.Invariant(this.Solde &gt; 0);
    }
}
</pre>
</pre>
</div>
<p>Une fois compilée, la méthode MonInvariant() fait partie de la classe comme toute méthode privée classique. L’outil de réécriture modifiera automatiquement le code afin que la méthode soit appelée après chaque méthodes ou getter/setter publiques.</p>
<p>Si maintenant on exécute l’exemple suivant :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:7b2b9f7e-79ce-4ada-9840-af0d0d69ad18" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
static void Main(string[] args)
{
    CompteBancaire cb = new CompteBancaire();
    cb.Créditer(100);
    cb.Débiter(200);
}
</pre>
</pre>
</div>
<p>Comme pour les post-conditions une exception de type ContractException est automatiquement levée :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/11/image.png" width="438" height="134" /></p>
<h3>Les invariants ne valident pas les champs/propriétés privées !</h3>
<p>Beaucoup d’exemples sur d’autres site web montrent des invariants qui valident les champs et les propriétés privées. Même si cela est techniquement possible, c’est complètement aberrant d’un point de vue conceptuel. En effet, les invariants sont des contrats qui seront visibles par les intégrateurs. Les conditions doivent donc définir des constantes sur des objets publiques !</p>
<p>Par exemple, si un intégrateur ne respecte pas un invariant qui fait référence à un champ privé, il peut obtenir un message d’erreur comme ceci :</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/11/image1.png" width="332" height="68" /></p>
<p>Comment peut-il savoir que la variable “s” correspond au solde du compte bancaire ???</p>
<p>Les conditions des invariants doivent donc porter sur des propriétés visibles par les intégrateurs (<span style="color: #0000ff"><strong>public</strong></span> ou <strong><span style="color: #0000ff">protected</span></strong>).</p>
<p>Ce post était consacré aux invariants, nous verrons dans le prochain comment définir des contrats sur les interfaces.</p>
<p>Stay tuned !</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie-4-les-invariants.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[.NET] Code Contracts &#8211; Partie 3 &#8211; Les post-conditions</title>
		<link>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html</link>
		<comments>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html#comments</comments>
		<pubDate>Mon, 24 Oct 2011 22:40:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Contracts]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-3-les-post-conditions.html</guid>
		<description><![CDATA[Nous avons vu précédemment comment définir des pré-conditions à l’aide de Code Contracts. Nous allons voir maintenant comment définir des post-conditions à l’aide de Code Contracts. Ce post fait partie d’une série de post consacré à Code Contracts : Partie 01 &#8211; Introduction Partie 02 – Les pré-conditions Partie 03 – Les post-conditions Partie 04 [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons vu précédemment comment <a title="Code Contracts - Partie 2 - Les pré-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">définir des pré-conditions à l’aide de Code Contracts</a>. Nous allons voir maintenant comment définir des post-conditions à l’aide de Code Contracts.</p>
<p><span id="more-610"></span>Ce post fait partie d’une série de post consacré à Code Contracts :
<ul>
<li><a title="Code Contracts - Partie 01 - Introduction" href="http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html" target="_blank">Partie 01 &#8211; Introduction</a> </li>
<li><a title="Partie 02 – Les pré-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">Partie 02 – Les pré-conditions</a> </li>
<li><strong>Partie 03 – Les post-conditions</strong></li>
<li><a title="Code Contracts - Partie 04 - Les invariants" href="http://gilles.tourreau.fr/?p=618" target="_blank">Partie 04 – Les invariants</a> </li>
</ul>
<h4>Qu’est-ce qu’une post-condition ?</h4>
<p>Une post-condition permet de définir un contrat qui devra être respecté avant de sortir d’une méthode (ou d’un getter/setter d’une propriété). Les post-conditions doivent être vue comme un contrat ou une assurance qu’un développeur va exposer aux appelants d’une méthode.</p>
<p>Code Contracts permet de définir 4 types de post-conditions :</p>
<ul>
<li>Sur la valeur de retour d’une méthode </li>
<li>Sur la valeur d’un paramètre de sortie d’une méthode (paramètre de type <span style="color: #0000ff"><strong>out</strong></span>) </li>
<li>Sur la valeur précédente (initiale) d’une propriété ou d’un paramètre d’une méthode. </li>
<li>Sur la valeur d’une propriété ou d’un paramètre après la levée d’une exception dans une méthode </li>
</ul>
<h4>Les post-condition ne servent pas d’assertion !</h4>
<p>Lorsque je présente les post-conditions, les développeurs sont souvent tentés d’utiliser les post-conditions comme un outil permettant de contrôler le retour d’une méthode. Bien que c’est le but de l’outil de ré-écriture <em>ccrewriter</em>, ce n’est vraiment pas la philosophie des post-conditions de Code Contracts.</p>
<p>Une post-condition doit-être vue comme un message que l’on souhaite passer au développeur qui utilisera notre méthode (ou à l’appelant). Si on prend comme exemple l’affirmation suivante : “L’appel de la méthode M() retournera toujours une référence vers un objet (plus techniquement la référence retournée ne sera jamais nulle)”. Le développeur (ou l’intégrateur) qui utilisera la méthode M(), sera qu’il n’est pas nécessaire de tester la nullité de la référence récupérée par la méthode M().</p>
<p><strong>Contrairement aux pré-conditions, si le contrat n’est pas validé, ce n’est pas la faute de l’appelant mais au concepteur de la méthode !</strong></p>
<h4>Comment définir une post-condition ?</h4>
<p>Code Contracts permet de définir très simplement une post-condition à l’aide de la méthode <em>Contract.Ensures()</em>. Cette méthode doit-être spécifiée au début du corps de la méthode avec les pré-conditions.</p>
<p>Comme pour les pré-conditions, la méthode Contract.Ensures() prend en paramètre la condition à vérifier et si nécessaire un message explicatif associé.</p>
<p>L’exemple suivant, montre une post-condition qui garanti que la propriété <em>MonObjet</em> fera référence à un objet.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1f4787ce-de20-4bbf-8bb0-a7c1348123d9" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public class MonObjet
{
    public string Message
    {
        get;
        private set;
    }

    public void RemplirMessage()
    {
        Contract.Ensures(this.Message != null);

        this.Message = &quot;Hello !&quot;;
    }
}
</pre>
</pre>
</div>
<p>Comme pour les pré-conditions, il faut voir les appels à la méthode <em>Contract.Ensures()</em> comme des méta-données. Ce sont les outils lancées après la compilation qui permettront d’interpréter ce genre de contrats.</p>
<p>En utilisant l’exemple précédent, il est donc possible d’appeler la méthode <em>RemplirMessage()</em> et d’utiliser directement la propriété <em>Message</em> sans tester sa nullité.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c9ac85a7-a85b-4d19-a9a6-4fc7047e7cea" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
MonObjet instance = new MonObjet();
instance.RemplirMessage();

char c = instance.Message[0];
</pre>
</pre>
</div>
<p>Si maintenant on active l’outil de ré-écriture de Code Contracts (<a title="Code Contracts - Partie 02 - Les pré-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">je vous invite à consulter mon post précédent pour plus d’informations</a>) et que le contrat n’est pas valide (c’est à dire si la propriété <em>Message</em> est à <strong><span style="color: #0000ff">null</span></strong> en sortie de la méthode) on obtiendra l’exception suivante :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image16.png" width="498" height="125" /></p>
<h4>Définir une post-condition sur la valeur de retour d’une méthode.</h4>
<p>Code Contracts permet de définir des post-conditions sur la valeur de retour d’une méthode. Pour cela il faut utiliser la méthode <em>Contract.Result&lt;T&gt;()</em>, avec T le type de retour de la méthode.</p>
<p>La méthode <em>Contract.Result&lt;T&gt;()</em> est une méta-données qui représente la valeur de retour de la méthode courante. L’exemple suivant illustre une méthode <em>GetClients()</em> retournant un tableau de client qui ne doit pas être <strong><span style="color: #0000ff">null</span></strong> :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:84ff1dc5-85e1-4cd3-b60f-5f0a9c1e375f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public Client[] GetClients()
{
    Contract.Ensures(Contract.Result&amp;lt;Client[]&amp;gt;() != null);

    return new Client[]
    {
        new Client() { Nom = &quot;TOURREAU&quot; }
    };
}
</pre>
</pre>
</div>
<p>Ce genre de post-condition apporte une information importante pour l’appelant. En effet, le résultat de l’appel de la méthode <em>GetClients()</em> peut-être directement utilisé dans une boucle de type <span style="color: #0000ff"><strong>foreach</strong></span> car le tableau obtenu ne sera jamais <span style="color: #0000ff"><strong>null</strong></span> (une vérification de l’existence d’un tableau n’est donc pas nécessaire au niveau de l’appelant).</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:0a7b75bc-13b6-44f3-8d3f-4028f9dfd6ee" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
MonObjet instance = new MonObjet();

foreach (Client client in instance.GetClients())
{
    Console.WriteLine(client.Nom);
}
</pre>
</pre>
</div>
<h4>Définir une post-condition sur un paramètre de sortie d’une méthode.</h4>
<p>Code Contracts offre une méthode <em>Contract.ValueAtReturn()</em> permettant de définir des post-conditions sur des paramètres de sortie d’une méthode (paramètre de type <strong><span style="color: #0000ff">out</span></strong>) :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:04ed190a-ed15-45de-913b-bd7db3faf435" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public void GetMessage(out string message)
{
    Contract.Ensures(Contract.ValueAtReturn(out message) != null);

    message = &quot;Hello !&quot;;
}
</pre>
</pre>
</div>
<p>Dans cet exemple, la post-conditions définie permet d’assurer à l’appelant que le paramètre de sortie message sera toujours différent de <strong><span style="color: #0000ff">null</span></strong>.</p>
<h4>Définir une post-condition sur la valeur précédente d’un paramètre ou d’une propriété.</h4>
<p>Code Contracts offre une fonctionnalité très puissante permettant de définir des post-conditions sur les valeurs initiales d’un paramètre ou d’une propriété. La méthode Contract.OldValue&lt;T&gt;() représente une méta-données qui correspond à la valeur initiale d’un paramètre ou d’une propriété.</p>
<p>L’outil de ré-écriture <em>ccrewriter</em> s’occupera d’insérer les variables temporaires permettant de comparer les valeurs des paramètres ou des propriétés au début et à la fin de l’appel à une méthode.</p>
<p>Imaginons une classe contenant un compteur (propriété) et une méthode qui affiche et incrémente ce compteur. Il serait intéressant dans la méthode d’exposer une post-condition qui indique que la valeur du compteur aie bien été incrémentée :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:0a6fcc3f-91dc-4df3-9289-4b02f101581b" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
public class MonObjet
{
    public int Compteur
    {
        get;
        set;
    }

    public void Compter()
    {
        Contract.Ensures(Contract.OldValue(this.Compteur) + 1 == this.Compteur);

        Console.WriteLine(this.Compteur);

        this.Compteur++;
    }
}
</pre>
</pre>
</div>
<h4>Définir une post-condition sur la valeur d’un paramètre ou d’une propriété après la levée d’une exception.</h4>
<p>Code Contracts permet de définir une post-condition sur un paramètre ou une propriété après la levée d’une exception. Cela est très pratique pour indiquer à l’appelant que certaines propriétés ne sont pas modifiées ou sont réinitialisée en cas de levée d’une exception.</p>
<p>Pour définir ce genre de post-condition il faut utiliser la méthode <em>Contract.EnsuresOnThrow&lt;T&gt;()</em> avec T le type d’exception qui doit être déclenché pour vérifier la condition.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9637bc46-6170-469f-b292-e4a0b3bef68f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public class MonObjet
{
    public string Message
    {
        get;
        set;
    }

    public void UpdateMessage(bool déclencherException)
    {
        Contract.EnsuresOnThrow&amp;lt;InvalidOperationException&amp;gt;(this.Message == null);

        if (déclencherException == true)
        {
            this.Message = null;
            throw new InvalidOperationException();
        }

        this.Message = &quot;Hello !&quot;;
    }
}
</pre>
</pre>
</div>
<p>Dans l’exemple précédent, l’appelant peut avoir l’assurance que la propriété Message sera à null si la méthode <em>UpdateMessage()</em> déclenche une exception de type <em>InvalidOperationException</em>.</p>
<p>Ce post était consacré aux post-conditions, nous verrons dans le prochain <a title="Code Contracts - Partie 04 - Les invariants" href="http://gilles.tourreau.fr/?p=618" target="_blank">les invariants</a>.</p>
<p>Stay tuned !</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[.NET] Code Contracts &#8211; Partie 2 &#8211; Les pr&#233;-conditions</title>
		<link>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie2-les-pre-conditions.html</link>
		<comments>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie2-les-pre-conditions.html#comments</comments>
		<pubDate>Tue, 11 Oct 2011 21:50:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Contracts]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/?p=604</guid>
		<description><![CDATA[Ce post fait suite à une introduction sur Code Contracts. Il explique ce qu’est une pré-condition, comment les définir et aussi comment les activer à l’aide de l’outil de réécriture. Ce post fait partie d’une série de post consacré à Code Contracts : Partie 01 &#8211; Introduction Partie 02 – Les pré-conditions Partie 03 – [...]]]></description>
			<content:encoded><![CDATA[<p>Ce post fait suite à <a title="Code Contract - Partie 1 - Introduction" href="http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html" target="_blank">une introduction sur Code Contracts</a>. Il explique ce qu’est une pré-condition, comment les définir et aussi comment les activer à l’aide de l’outil de réécriture.</p>
<p><span id="more-604"></span>Ce post fait partie d’une série de post consacré à Code Contracts :
<ul>
<li><a title="Code Contracts - Partie 01 - Introduction" href="http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html" target="_blank">Partie 01 &#8211; Introduction</a> </li>
<li><strong>Partie 02 – Les pré-conditions</strong> </li>
<li><a title="Code Contracts - Partie 03 – Les post-conditions" href="http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html" target="_blank">Partie 03 – Les post-conditions</a> </li>
<li><a title="Code Contracts - Partie 04 - Les invariants" href="http://gilles.tourreau.fr/?p=618" target="_blank">Partie 04 – Les invariants</a> </li>
</ul>
<h4>Qu’est ce qu’une pré-condition ?</h4>
<p>Une pré-condition est un contrat que doit respecter un appelant pour utiliser une méthode où une propriété. Le plus souvent les pré-conditions permettent de contrôler les paramètres d’une méthode, mais on peut les utiliser pour définir des contrats sur l’état que doit avoir un objet lors de l’appel à une méthode.</p>
<h4>Comment définir une pré-condition ?</h4>
<p>Code Contracts permet de définir très simplement un contrat à l’aide de la méthode <em>Contract.Requires()</em> :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:e84ca1cf-819c-4121-8c73-6f0e91fd71a4" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
public static double Diviser(int dividende, int diviseur)
{
    Contract.Requires(diviseur != 0, &quot;Le diviseur ne peut pas être égale à 0&quot;);

    return dividende / diviseur;
}
</pre>
</pre>
</div>
<p>Le premier paramètre est une expression booléenne qui représente le contrat et qui doit toujours être vrai pour que le contrat soit respecté. Le deuxième paramètre est une chaine de caractères qui représente une message d’erreur à afficher si le contrat n’est pas respecté.</p>
<p>Il est possible de spécifier plusieurs contrats, dans ce cas il faudra les spécifier les uns à la suite des autres. Il est aussi tout à fait possible de spécifier plusieurs contrats portant sur le même paramètre :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2b3e85f2-e104-4330-98bd-2316f7dd7c49" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public static void Afficher(string nom, int age)
{
    Contract.Requires(nom != null);
    Contract.Requires(nom.Length &gt; 3);
    Contract.Requires(1 &lt;= age &amp;&amp; age &lt;= 99);

    Console.WriteLine(&quot;{0} : {1}&quot;, nom, age);
}
</pre>
</pre>
</div>
<h4>La méthode <em>Contract.Requires()</em> doit-être vue comme des méta-données…</h4>
<p>La méthode <em>Contract.Requires()</em> ne doit pas être vu comme une méthode qui exécute du code, mais comme des méta-données de la méthode Diviser() (exactement comme des attributs .NET).</p>
<p>En effet, si on exécute la méthode <em>Diviser()</em> avec un diviseur à 0, aucun mécanisme de sécurité sur le contrat n’est déclenché. Le code continue son exécution jusqu’à levée une exception au niveau de la division par 0.</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image4.png" width="561" height="243" /></p>
<p>Pourtant si l’on regarde le code généré on se rend très vite compte que l’appel à la méthode Contract.Requires() a disparu :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image5.png" width="390" height="84" /></p>
<p>Pourquoi ? Tout simplement parce qu&#8217;elle dispose d’un attribut conditionnel spécifiant que la macro CONTRACTS_FULL doit-être défini au moment de la compilation.</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image6.png" width="281" height="132" /></p>
<p>Si on défini la macro CONTRACTS_FULL dans les propriétés de projet…</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image7.png" width="342" height="73" /></p>
<p>Et que l’on relance l’application, un message d’avertissement apparait :</p>
<p align="center"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image8.png" width="452" height="176" /></p>
<p>Ce message indique qu’il est nécessaire d’utiliser un outil de réécriture lorsque l’on utilise les pré-conditions à l’aide de Contract.Requires(). <strong>ccrewriter</strong> est l’un des outils inclus de Code Contracts qui permet de transformer les appels de la méthode Contract.Requires() en levée d’exception .NET.</p>
<p>L’activation de l’outil de réécriture <strong>ccrewriter</strong> se fait depuis l’onglet Code Contracts dans les paramètres de projet. Il suffit d’activer l’option “<strong>Perform Runtime Contract Checking</strong>” à “<strong>Full</strong>”. (Nous verrons plus en détail un peu plus-tard les options disponibles dans les paramètres de projet).</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image9.png" width="356" height="114" /></p>
<p>Après recompilation, une exception de type <em>ContractException</em> est levée si le diviseur passé en paramètre est égal à 0 :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image10.png" width="692" height="147" /></p>
<h4>Déclenchez une exception d’un autre type</h4>
<p>Il existe une surcharge de la méthode <em>Contract.Requires()</em> qui est générique et qui permet de déclencher une exception autre que <em>ContractException</em>. Le type de l’exception à déclencher doit-être spécifié en paramètre de type à la méthode Contract.Requires(). Dans notre cas, si on veut lever une exception de type <em>ArgumentException</em> en cas de non respect de notre contrat, il faut écrire :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1cb8eee8-efa4-4c1e-935c-d7a711fb640c" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public static double Diviser(int dividende, int diviseur)
{
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(diviseur != 0, &quot;Le diviseur ne peut pas être égal à 0&quot;);

    return dividende / diviseur;
}
</pre>
</pre>
</div>
<p>Pour que ce code puisse être compilé et réécrit avec <strong>ccrewriter</strong>, il est nécessaire de définir l’option “<strong>Assembly Mode</strong>” à “<strong>Standard Contract Requires</strong>” dans les propriétés du projet.</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image11.png" width="340" height="82" /></p>
<p>Après compilation, on obtient à l’exécution, la levée d’une exception de type <em>ArgumentException</em> lors que le diviseur passé en paramètre est à 0 :</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image12.png" width="592" height="129" /></p>
<h4>Contrôler les paramètres de type IEnumerable&lt;T&gt; (ForAll() et Exists())</h4>
<p>La classe <em>Contract</em> contient deux méthodes ForAll() et Exists() permettant de contrôler des éléments se trouvant dans une séquence de type <em>IEnumerable&lt;T&gt;</em>.</p>
<ul>
<li>La méthode ForAll() vérifie que tous les éléments d’une séquence respecte la condition spécifiée en paramètre. </li>
<li>La méthode Exists() vérifie qu’au moins un élément d’une séquence respecte la condition spécifiée en paramètre. </li>
</ul>
<p>Ces méthodes peuvent être vues comme un moyen simple de faire une simple boucle <strong><span style="color: #0000ff">foreach</span></strong> dans des contrats. Dans les deux cas, les conditions sont spécifiés à l’aide d’une lambda expression. L’exemple qui suit montre comment vérifier que les éléments d’une séquence de noms ne soient pas null, vide ou contenant des espaces. Remarquez qu’il ne faut pas oublier d’ajouter un contrat permettant de vérifier que l’énumération passé en paramètre n’est pas null.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:5ff73083-3140-495e-8cbb-5548b8dd00ff" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public static void Afficher(IEnumerable&amp;lt;string&amp;gt; noms)
{
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(noms != null);
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(Contract.ForAll(noms, nom =&gt; string.IsNullOrWhiteSpace(nom)) == false);

    foreach (string nom in noms)
    {
        Console.WriteLine(nom);
    }
}
</pre>
</pre>
</div>
<p>Si l’on passe en paramètre une séquence (par exemple un tableau) contenant une chaine nulle ou vide on obtiendra l’exception suivante :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image13.png" width="674" height="146" /></p>
<p>Il existe une surcharge supplémentaires pour les méthodes ForAll() et Exists() qui permettent d’incrémenter une variable et de vérifier une condition à chaque itération. Ces surcharges peuvent être vues comme un moyen de réaliser une boucle <strong><span style="color: #0000ff">for</span></strong> dans des contrats. L’exemple suivant montre comment contrôler que tous les nombres d’un tableau spécifié en paramètre sont des nombres paires :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:5cb61551-d78c-4b32-b54c-a8fdccbf8306" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public static void Afficher(int[] t)
{
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(t != null);
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(Contract.ForAll(0, t.Length, i =&gt; t[i] % 2 == 0));

    foreach (int nombre in t)
    {
        Console.WriteLine(nombre);
    }
}
</pre>
</pre>
</div>
<h4>Fini le blabla ! Laisser parler votre code !</h4>
<p>Une des forces de Code Contracts est la possibilité d’inclure la condition des contrats dans les messages d’erreur. Plus précisément, c’est l’outil de réécriture <strong>ccrewriter</strong> qui prend la condition booléenne C# et en fait une chaine de caractères pour l’inclure dans les messages d’erreur.</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image14.png" width="462" height="63" /></p>
<p>Ainsi, il n’est plus nécessaire d’écrire, de traduire et de maintenir une chaine de caractères représentant le message d’erreur affiché lorsqu’un contrat n’est pas valide.</p>
<p>Ce mécanisme permet d’avoir un certain “typage fort” entre vos contrats et les messages d’erreurs associés. En effet, si vous renommez un paramètre vous serai obligé de modifier les conditions des contrats associés (sinon la compilation est impossible). Il n’est donc plus nécessaire de modifier des chaines de caractères.</p>
<p>L’exemple suivant montre le code de la méthode Diviser() en supprimant le message d’erreur associé au contrat qui porte sur le diviseur :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:910be168-15d7-4020-b462-0bc4237d050f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public static double Diviser(int dividende, int diviseur)
{
    Contract.Requires&amp;lt;ArgumentException&amp;gt;(diviseur != 0);

    return dividende / diviseur;
}
</pre>
</pre>
</div>
<p>A l’exécution, lorsque le contrat est invalide, l’appelant obtiendra l’exception suivante :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image15.png" width="522" height="127" /></p>
<p>Ce post était consacré aux pré-conditions, nous verrons dans le prochain les <a title="Code Contracts - Partie 03 - Les post-conditions" href="http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html" target="_blank">post-conditions</a>.</p>
<p>Stay tuned !</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie2-les-pre-conditions.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[.NET] Code Contracts &#8211; Partie 1 &#8211; Introduction</title>
		<link>http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html</link>
		<comments>http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html#comments</comments>
		<pubDate>Sun, 09 Oct 2011 22:15:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code Contracts]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html</guid>
		<description><![CDATA[Code Contracts est une nouvelle fonctionnalité du .NET Framework qui permet de définir des contraintes dans du code .NET qui pourront être réutilisées par des outils d’analyse ou d’écriture du code. Ce post fait partie d’une série de post consacré à Code Contracts : Partie 01 – Introduction Partie 02 – Les pré-conditions Partie 03 [...]]]></description>
			<content:encoded><![CDATA[<p>Code Contracts est une nouvelle fonctionnalité du .NET Framework qui permet de définir des contraintes dans du code .NET qui pourront être réutilisées par des outils d’analyse ou d’écriture du code.</p>
<p><span id="more-591"></span>
<p>Ce post fait partie d’une série de post consacré à Code Contracts :</p>
<ul>
<li><strong>Partie 01 – Introduction</strong> </li>
<li><a title="Code Contracts - Partie 02 - Les pré-conditions" href="http://gilles.tourreau.fr/?p=604" target="_blank">Partie 02 – Les pré-conditions</a> </li>
<li><a title="Code Contracts - Partie 03 – Les post-conditions" href="http://gilles.tourreau.fr/dotnet_framework/dotnet-code-contracts-partie3-les-post-conditions.html" target="_blank">Partie 03 – Les post-conditions</a> </li>
<li><a title="Code Contracts - Partie 04 - Les invariants" href="http://gilles.tourreau.fr/?p=618" target="_blank">Partie 04 – Les invariants</a> </li>
</ul>
<p>Depuis que je suis architecte, j’insiste énormément sur la qualité des développements et en particulier le fait de détecter les erreurs le plus rapidement possible (durant la phase de développement ! Et non à l’intégration, recette ou pré-production !).</p>
<p>A travers différents posts sur mon blog (au moins une quinzaine), je vais présenter cette technologie du .NET Framework 4.0 qui actuellement très peu utilisé, mais qui devrait être obligatoire d’utiliser dans tout développement logiciel sous .NET.</p>
<h3>Qu’est ce qu’un contrat ?</h3>
<p>Lorsque l’on regarde la documentation MSDN concernant les bibliothèques du .NET Framework, on se rend compte que Microsoft impose des contraintes que l’on doit respecter avant d’utiliser certaines fonctionnalités (par exemple l’appel à la méthode <em>String.Substring()</em>).</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image.png" width="592" height="727" /></p>
<p>Si on regarde la capture précédente, les contraintes imposées par Microsoft pour utiliser la méthode String.Substring() sont surlignées en jaune. Cette contrainte est ce que l’on appel un contrat.</p>
<h3>Pourquoi imposer des contrats ?</h3>
<p>Lorsqu’un développeur conçoit une classe, il offre une partie “publique” qui sera certainement utilisé par un autre développeur, qui au passage, n’est pas forcement dans la même équipe (par exemple un intégrateur). Etant donné que l’autre développeur n’a pas directement connaissance de l’implémentation de la classe, il est donc nécessaire de contrôler et documenter les appels à la partie publique à l’aide de contraintes (où plutôt contrats). Les contrats permettent d’assurer au développeur de la classe que les données d’entrées sont valides et n’auront pas d’effet secondaires sur l’exécution de la classe.</p>
<p>Lorsqu’un contrat n’est pas respecté, il n’est théoriquement pas possible d’effectuer une compilation. Si le compilateur ne supporte pas la vérification des contrats, alors l’exécution de l’application doit-être stoppée.</p>
<h3>Que ce passe-t-il si on n’impose pas des contrats ?</h3>
<p>Prenons l’exemple suivant :</p>
<p>On propose une méthode<em> Traitement()</em> prenant en paramètre une interface que doit implémenter un intégrateur. Cette interface contient une méthode <em>GetObject()</em> qui retourne un objet qui sera affiché dans une application Console.</p>
<p>Voici le code de cette interface :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:e83218bb-2055-49f5-88a6-7e9da246e83f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public interface IObjectProvider
{
    object GetObjet();
}
</pre>
</pre>
</div>
<p>Et le code de la méthode Traitement() qui prend en paramètre un objet implémentant l’interface précédente :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d45791d5-76c2-4fc9-bd64-fb8b45ad13a4" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public class ConsoleDisplay
{
    public void Write(IObjectProvider provider)
    {
        object obj;

        obj = provider.GetObjet();

        Console.WriteLine(obj.ToString());
    }
}
</pre>
</pre>
</div>
<p>Maintenant, imaginons que l’on compile et livre en Release la classe ConsoleDisplay et l’interface IObjectProvider à un intégrateur. Ce dernier va donc implémenter l’interface IObjectProvider comme ceci :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9105f4cc-f5c1-4859-9b46-555d5009f96f" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
public class MyObjectProvider : IObjectProvider
{
    public object GetObjet()
    {
        return null;
    }
}
</pre>
</pre>
</div>
<p>Voici maintenant un exemple d’utilisation de la classe ConsoleDisplay développé par l’intégrateur :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d2760766-2d39-40da-828b-95a9e7026001" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; title: ; notranslate">
MyObjectProvider myProvider = new MyObjectProvider();
ConsoleDisplay display = new ConsoleDisplay();

display.Write(myProvider);
</pre>
</pre>
</div>
<p>Si l’intégrateur exécute ce code, il obtiendra l’erreur suivante :</p>
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image1.png" width="515" height="164" /></p>
<p>On obtient une exception de type NullReferenceException alors que les variables display et myProvider ne sont pas null. Le bug se trouve donc à l’intérieur de la méthode Write() (le StackTrace de l’exception nous donnera confirmation). Lorsque l’on obtient ce genre d’erreur, est-ce à l’intégrateur de le corriger ou à nous ? Bien évidemment, c’est à l’intégrateur… Mais comment peut-il savoir d’où vient le problème et comment le corriger ? Tout simplement en l’aidant à l’aide des contrats !</p>
<h3>Ecrire des contrats avant le .NET Framework 4.0… </h3>
<p>Du .NET Framework 1.0 jusqu’au 3.5 inclus, il était possible de définir des contrats sur les paramètres des méthodes en utilisant les exceptions :</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:eda173ad-1a24-450a-8781-cee1aecc5911" class="wlWriterEditableSmartContent">
<pre>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
public double Division(double dividende, double diviseur)
{
    if (diviseur == 0)
    {
         throw new ArgumentException(&quot;Le diviseur ne peut pas être à 0&quot;, &quot;diviseur&quot;);
    }

    return dividende / diviseur;
}
</pre>
</pre>
</div>
<p>Le code précédent déclenche une exception de type <em>ArgumentException</em> si le contrat n’est pas respecté (ici le diviseur ne doit pas être égal à 0). En production, la levée des exceptions dérivée de <em>ArgumentException</em> indique un bug dans l’application dû au passage d’un paramètre incorrect. Ce n’est donc pas à l’utilisateur final de corriger cette erreur, mais bien au développeur de l’application. Ce genre d’exception ne devrait donc jamais être interceptées dans un bloc try/catch.</p>
<h3>Les avantages de Code Contracts</h3>
<p>Si on regarde le code précédent, on se rend très vite compte de plusieurs inconvénients :</p>
<ul>
<li>Les contrats ne sont pas vérifiés à la compilation </li>
<li>Le nom du paramètre est une chaine de caractère (pas de typage pour le refactoring) </li>
<li>Les contrats ne sont pas hérités lors de la redéfinition d’une méthode (nécessite de dupliquer du code) </li>
<li>Il est nécessaire de documenter explicitement les commentaires XML </li>
<li>Il n’est pas possible de définir des contrats dans une interface (ou méthodes abstraites). </li>
<li>Il n’est pas possible de supprimer les contrats en production </li>
</ul>
<p>Code Contracts permet de palier à tous ces problèmes en offrant :</p>
<ul>
<li>La vérification des contrats à la compilation </li>
<li>Le typage fort des contrats </li>
<li>L’héritage des contrats dans la redéfinition des méthodes </li>
<li>La documentation automatique des contrats en XML </li>
<li>La possibilité de définir des contrats dans les interfaces (et méthodes abstraites) </li>
<li>La possibilité de créer un assembly séparé contenant uniquement les contrats </li>
</ul>
<p>Code Contracts propose en plus de :</p>
<ul>
<li>Définir des post-conditions </li>
<li>Définir des invariants </li>
<li>De redéfinir la politique de vérification des contrats </li>
<li>De créer de nouveau contrats (agrégations de contrats) </li>
</ul>
<h3>Concept de Code Contracts</h3>
<p>Code Contracts s’utilisent en 2 étapes :</p>
<ul>
<li>La première consiste à définir les contrats dans le code en utilisant les classes contenues dans le namespace <em>System.Diagnostics.Contracts</em>. Ces classes ne produisent aucun effet à l’exécution. Il faut donc voir les contrats comme des meta-données sur le code (exactement comme des attributs .NET). </li>
<li>La deuxième étape consiste à exécuter un outil qui analysera les contrats contenu dans l’assembly compilé et qui produira en sortie différents résultats. Microsoft propose avec Code Contracts trois outils :
<ul>
<li>ccrewriter : Cet outils va convertir les contrats spécifiés dans un assembly compilé en un code .NET permetant de vérifier les contrats à la l’exécution. </li>
<li>cccheck : Cet outil va analyser un assembly et vérifier statiquement que tous les appelants respecte bien les contrats. </li>
<li>ccdoc : Cet outil va extraire les contrats et produire une documentation XML qui sera possible d’utiliser dans SandCastle. </li>
</ul>
</li>
</ul>
<p><a href="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image2.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image_thumb.png" width="634" height="259" /></a></p>
<p>Le schéma précédent montre un exemple d’utilisation de l’outil <em>ccrewriter</em> :</p>
<ol>
<li>Les contrats sont définit dans le code C# et doit-être vu comme des méta-données </li>
<li>Après compilation, le contrats sont compilés mais ne produisent aucun effet </li>
<li>Après exécution de l’outil <em>ccrewriter</em> les contrats compilé sont transformé en bloc if/then/throw permettant de contrôler les contrats et lever une exception si ces derniers ne sont pas valides. </li>
</ol>
<p>Bien évidemment, il y a de grande chance que Microsoft et d’autres éditeurs tiers fournissent d’autres outils. Il est d’ailleurs possible de créer un outil de ce genre en utilisant le projet open source Microsoft : <a title="Common Compiler Infrastructure" href="http://ccimetadata.codeplex.com/" target="_blank">Common Compiler Infrastructure</a>.</p>
<p>La classe principale permettant de définir des contrats est la classe <em>Contract</em>. Elle contient un ensemble de méthodes qui permettent de définir des pré-conditions, des post-conditions et des invariants. J’insiste sur le fait que ces méthodes ne produisent aucun effet à l’exécution si on utilise les assemblys compilés tel quel. Il faudra lancer l’outil <em>ccrewriter</em> après la compilation afin de réécrire les assemblys compilés et transformer les contrats déclarés en un code qui réalisera des tests et lèvera des exceptions si les contrats ne sont pas respectés.</p>
<h3>Ce qu’il faut pour utiliser Code Contracts</h3>
<p>Les classes permettant de définir les contrats sont incluses dans le .NET Framework 4.0 (assembly System.dll), il est cependant possible d’utiliser Code Contracts avec le .NET Framework 3.5 utilisant l’assembly <em>Microsoft.Contracts</em> qui peut-être téléchargé sur le site de Microsoft.</p>
<p>Les outils de réécriture et d’analyse de code ne sont pas fourni avec le .NET Framework ni avec Visual Studio. Il faudra télécharger ces outils sur le site officiel de code Code Contract sur le site de Microsoft Research : <a title="http://research.microsoft.com/en-us/projects/contracts/" href="http://research.microsoft.com/en-us/projects/contracts/">http://research.microsoft.com/en-us/projects/contracts/</a></p>
<p>L’équipe de Code Contracts propose aussi une <a title="Code Contracts Editor Extensions" href="http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86-e7f0b8d8c71b" target="_blank">extension pour Visual Studio 2010</a> qui propose des snippets de code et l’affichage des contrats dans l’info-bulle de l’éditeur de code.</p>
<p>Une fois les outils installé, le paramétrage de <em>ccrewriter</em>, <em>cccheck</em> et <em>ccdoc</em> se font depuis les propriétés du projet :</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://gilles.tourreau.fr/wp-content/uploads/2011/10/image3.png" width="754" height="520" /></p>
<p>Si vous disposez d’une version Premium ou Ultimate de Visual Studio, vous avez la possibilité d’activer la vérification statique du code.</p>
<p>Dans les posts suivants, nous verront comment définir et activer des contrats avec Code Contracts.</p>
<p>Stay tuned ! </p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/dotnet_framework/net-code-contracts-partie-1-introduction.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[MS Days 2011] Ask To Expert aux Microsoft Days &#224; Paris</title>
		<link>http://gilles.tourreau.fr/non-classe/ms-days-2011-ask-to-expert-aux-microsoft-days-paris.html</link>
		<comments>http://gilles.tourreau.fr/non-classe/ms-days-2011-ask-to-expert-aux-microsoft-days-paris.html#comments</comments>
		<pubDate>Tue, 27 Sep 2011 20:26:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/non-classe/ms-days-2011-ask-to-expert-aux-microsoft-days-paris.html</guid>
		<description><![CDATA[Je vous donne rendez-vous le 4 octobre 2011 au Microsoft Days à Paris (au CNIT à la Défense) où je serai ATE (Ask To Expert). Je me ferai un plaisir de répondre à vos questions concernant les technologies Microsoft durant les pauses. Pour me reconnaitre, j’aurai un T-Shirt où sera inscrit “Ask To Expert”. Je [...]]]></description>
			<content:encoded><![CDATA[<p>Je vous donne rendez-vous le 4 octobre 2011 au Microsoft Days à Paris (au CNIT à la Défense) où je serai ATE (Ask To Expert).</p>
<p>Je me ferai un plaisir de répondre à vos questions concernant les technologies Microsoft durant les pauses. Pour me reconnaitre, j’aurai un T-Shirt où sera inscrit “Ask To Expert”.</p>
<p>Je vous invite à vous y rendre et à assister aux différentes sessions et en particulier celle dédiées aux dernières technologies Microsoft comme Windows Phone, Office 365 et Windows Azure.</p>
<p>Pour vous rendre aux Microsoft Days 2011, il est nécessaire de s’inscrire sur le site de Microsoft à la rubrique dédié aux <a title="Microsoft Days 2011" href="http://www.microsoft.com/france/microsoft-days/default.aspx" target="_blank">Microsoft Days 2011</a>.</p>
<p><a href="http://gilles.tourreau.fr/wp-content/uploads/2011/09/clip_image002.jpg"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" hspace="12" alt="clip_image002" src="http://gilles.tourreau.fr/wp-content/uploads/2011/09/clip_image002_thumb.jpg" width="244" height="172" /></a></p>
<p><a title="Inscrivez-vous aux Microsoft Days 2011 !" href="http://www.microsoft.com/france/microsoft-days/default.aspx"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="logo_header" border="0" alt="logo_header" src="http://gilles.tourreau.fr/wp-content/uploads/2011/09/logo_header.jpg" width="244" height="51" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/non-classe/ms-days-2011-ask-to-expert-aux-microsoft-days-paris.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[.NET] CCI Explorer une autre alternative open source de .NET Reflector</title>
		<link>http://gilles.tourreau.fr/csharp/dotnet-cci-explorer-une-autre-alternative-open-source-de-dotnet-reflector.html</link>
		<comments>http://gilles.tourreau.fr/csharp/dotnet-cci-explorer-une-autre-alternative-open-source-de-dotnet-reflector.html#comments</comments>
		<pubDate>Wed, 02 Mar 2011 11:05:58 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CCI Explorer]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/csharp/net-cci-explorer-une-autre-alternative-open-source-de-net-reflector.html</guid>
		<description><![CDATA[Je viens de livrer sur CodePlex la première version de mon projet CCI Explorer. Ce projet est une alternative open source de .NET Reflector qui est maintenant devenu payant. Comme son nom l’indique, CCI Explorer se base sur le projet open source “Common Compiler Infrastructure” de Microsoft qui permet de décompiler et d’analyser du code [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de livrer sur CodePlex la première version de mon projet <a href="http://cciexplorer.codeplex.com/" target="_blank">CCI Explorer</a>. Ce projet est une alternative open source de .NET Reflector qui est maintenant devenu payant.</p>
<p>Comme son nom l’indique, CCI Explorer se base sur le projet open source “<a href="http://ccimetadata.codeplex.com/" target="_blank">Common Compiler Infrastructure</a>” de Microsoft qui permet de décompiler et d’analyser du code depuis des assemblys .NET. Ce projet est utilisé par FxCop/Code Analysis, Sand Castle et Code Contracts.</p>
<p>Bien évidemment le projet en est à sa première version alpha, il manque donc plein de fonctionnalités, mais vous pouvez soumettre vos retours directement sur <a href="http://ccimetadata.codeplex.com/discussions" target="_blank">le site du projet</a>.</p>
<p><a href="http://cciexplorer.codeplex.com/releases/view/61867" target="_blank">Voici le lien pour télécharger la version 0.1.0.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/csharp/dotnet-cci-explorer-une-autre-alternative-open-source-de-dotnet-reflector.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[.NET] TechDays 2011 : Détecter vos erreurs de programmation à la compilation avec Code Contrats du Framework 4.0</title>
		<link>http://gilles.tourreau.fr/dotnet_framework/dotnet-techdays-2011-detecter-vos-erreurs-de-programmation-a-la-compilation-avec-code-contrats-du-framework-4-0.html</link>
		<comments>http://gilles.tourreau.fr/dotnet_framework/dotnet-techdays-2011-detecter-vos-erreurs-de-programmation-a-la-compilation-avec-code-contrats-du-framework-4-0.html#comments</comments>
		<pubDate>Wed, 12 Jan 2011 21:48:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Code Contracts]]></category>
		<category><![CDATA[TechDays]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/dotnet_framework/net-techdays-2011-dtecter-vos-erreurs-de-programmation-la-compilation-avec-code-contrats-du-framework-4-0.html</guid>
		<description><![CDATA[Dans moins d’un mois aura lieu les TechDays de Microsoft à Paris. A cette occasion j’aurai le plaisir d’animer une session consacrée à Code Contracts avec Amine ZEMZEMI (MSP). Code Contracts est une nouveauté du .NET Framework 4.0 qui permet de définir des contraintes qui seront validées à l’exécution et/ou à la compilation ! Venez [...]]]></description>
			<content:encoded><![CDATA[<p>Dans moins d’un mois aura lieu les TechDays de Microsoft à Paris. A cette occasion j’aurai le plaisir d’animer une session consacrée à Code Contracts avec <a title="Blog d'Amine ZEMZEMI" href="http://amine.zemzemi.free.fr/" target="_blank">Amine ZEMZEMI</a> (MSP).</p>
<p style="text-align: center;"><a title="Accéder au site officiel des TechDays" href="http://www.microsoft.com/france/mstechdays/" target="_blank"><img class="aligncenter" style="margin: 0px auto; display: block; float: none;" title="300x250_inscription" src="http://gilles.tourreau.fr/wp-content/uploads/2011/01/300x250_inscription.gif" alt="300x250_inscription" width="240" height="200" /></a></p>
<p>Code Contracts est une nouveauté du .NET Framework 4.0 qui permet de définir des contraintes qui seront validées à l’exécution et/ou <strong>à la compilation</strong> !</p>
<p>Venez donc découvrir dans cette session les différents types de contrôles que vous pourrez mettre en place (pré-conditions, post-conditions,…etc) et comment ils vont améliorer la qualité de votre application !</p>
<p>Après les TechDays, Amine et moi-même rédigerons très certainement plusieurs articles sur Code Contracts.</p>
<p><a title="Accéder à la page officielle de la session sur Code Contracts" href="http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx?Key=&amp;AUDIENCE=&amp;PRODUIT=&amp;LEVEL=&amp;SpkID=1b27acce-a954-4e47-8a2d-f6936571ae95&amp;domID=&amp;x=112&amp;y=21" target="_blank">Accéder à la page officielle de la session sur Code Contracts</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/dotnet_framework/dotnet-techdays-2011-detecter-vos-erreurs-de-programmation-a-la-compilation-avec-code-contrats-du-framework-4-0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Moi] De nouveau nommé MVP C# !</title>
		<link>http://gilles.tourreau.fr/csharp/moi-de-nouveau-nomme-mvp-csharp.html</link>
		<comments>http://gilles.tourreau.fr/csharp/moi-de-nouveau-nomme-mvp-csharp.html#comments</comments>
		<pubDate>Sun, 02 Jan 2011 21:41:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[MVP]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/csharp/moi-de-nouveau-nomin-mvp-c.html</guid>
		<description><![CDATA[Pour la 4ème fois je viens d’être nominé MVP C# ! Cette récompense est le résultat de mon implication dans la communauté Microsoft (Blog, Forums MSDN et dernièrement la publication de mon livre sur C#). Cette année je continuerai mon implication dans les forums MSDN et j’essayerai de publier beaucoup plus d’article sur mon blog [...]]]></description>
			<content:encoded><![CDATA[<p>Pour la 4ème fois je viens d’être nominé MVP C# ! Cette récompense est le résultat de mon implication dans la communauté Microsoft (Blog, Forums MSDN et dernièrement la publication de mon livre sur C#).</p>
<p style="text-align: center;"><img class="aligncenter" style="background-image: none; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="Logo MVP" src="http://gilles.tourreau.fr/wp-content/uploads/2011/01/mvp_vertical2.png" border="0" alt="Logo MVP" width="99" height="154" /></p>
<p>Cette année je continuerai mon implication dans les forums MSDN et j’essayerai de publier beaucoup plus d’article sur mon blog !</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/csharp/moi-de-nouveau-nomme-mvp-csharp.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Livre] Sortie de mon livre sur C#</title>
		<link>http://gilles.tourreau.fr/livres/sortie-de-mon-livre-sur-csharp.html</link>
		<comments>http://gilles.tourreau.fr/livres/sortie-de-mon-livre-sur-csharp.html#comments</comments>
		<pubDate>Fri, 24 Sep 2010 06:00:00 +0000</pubDate>
		<dc:creator>Gilles TOURREAU</dc:creator>
				<category><![CDATA[Livres]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Livre]]></category>

		<guid isPermaLink="false">http://gilles.tourreau.fr/?p=552</guid>
		<description><![CDATA[Aujourd’hui, vient de paraître mon premier livre sur C# ! Ce livre est destiné aux développeurs qui connaissent déjà les bases de la programmation et qui souhaitent apprendre très vite le C# 2.0, 3.0, 3.5 et 4.0. L’objectif de ce titre de la collection des Guides de survie est de présenter les fonctionnalités et les [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd’hui, vient de paraître mon premier livre sur C# !</p>
<p><span id="more-552"></span></p>
<p>Ce livre est destiné aux développeurs qui connaissent déjà les bases de la programmation et qui souhaitent apprendre très vite le C# 2.0, 3.0, 3.5 et 4.0.</p>
<p>L’objectif de ce titre de la collection des Guides de survie est de présenter les fonctionnalités et les concepts de base de C# aux développeurs familiers de la programmation. Il peut être lu de manière linéaire, mais il est possible de lire isolément un passage ou un chapitre particulier. Par ailleurs, les sections de ce livre sont conçues pour être indépendantes : il n’est donc pas nécessaire de lire les sections précédentes pour comprendre les différents exemples de code d’une section donnée.</p>
<p style="text-align: center;"><a title="Le Guide de Survie C# - Gilles TOURREAU - ISBN 978-2-7440-2432-0" href="http://www.amazon.fr/gp/product/2744024325?ie=UTF8&amp;tag=swdgt-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=2744024325" target="_blank"><img style="display: inline; border-width: 0px;" title="GillesTOURREAU_GuideDeSurvie_CSharp" src="http://gilles.tourreau.fr/wp-content/uploads/2010/09/GillesTOURREAU_GuideDeSurvie_CSharp.jpg" border="0" alt="GillesTOURREAU_GuideDeSurvie_CSharp" width="101" height="164" /><br />
Cliquez sur le livre pour le commander</a></p>
<p>Son prix est de 19€. Vous pouvez l’acheter directement sur <a title="Acheter le livre Guide de Survie C# sur Amazon." href="http://www.amazon.fr/gp/product/2744024325?ie=UTF8&amp;tag=swdgt-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=2744024325" target="_blank">Amazon.</a></p>
<p><strong>ISBN :</strong> 978-2-7440-2432-0</p>
<p>Au sommaire :</p>
<ol>
<li>Éléments du langage</li>
<li>Les classes</li>
<li>L&#8217;héritage</li>
<li>La gestion des erreurs</li>
<li>Les génériques</li>
<li>Les chaînes de caractères</li>
<li>LINQ (Language Integrated Query)</li>
<li>Les classes et interfaces de base</li>
<li>Les collections</li>
<li>Les flux</li>
<li>Les fichiers et répertoires</li>
<li>Les threads</li>
<li>La sérialisation</li>
<li>L&#8217;introspection</li>
</ol>
<p>Je tiens à remercier les Editions Person pour m’avoir permis de vivre l’aventure qu’à été la rédaction de cet ouvrage ainsi que Nicolas ETIENNE et Jean-Philippe MOREUX pour leur relecture.</p>
]]></content:encoded>
			<wfw:commentRss>http://gilles.tourreau.fr/livres/sortie-de-mon-livre-sur-csharp.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

