<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Patrice Lamarche - C#</title>
    <link>http://patricelamarche.net/</link>
    <description>Ce blog est moche. Je ne suis pas designer.</description>
    <language>fr-fr</language>
    <copyright>Patrice Lamarche</copyright>
    <lastBuildDate>Tue, 02 Mar 2010 13:39:22 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>patrice.lamarche@gmail.com</managingEditor>
    <webMaster>patrice.lamarche@gmail.com</webMaster>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=50e0ee78-c445-4cb1-a7bd-0261b7517537</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,50e0ee78-c445-4cb1-a7bd-0261b7517537.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,50e0ee78-c445-4cb1-a7bd-0261b7517537.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=50e0ee78-c445-4cb1-a7bd-0261b7517537</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.techheadbrothers.com/Articles.aspx/concatenations-chaines-csharp">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/LesconcatnationsdechainesenC_CE16/image_3.png" width="534" height="303" />
          </a>
        </p>
        <p align="justify">
Je viens de publier un nouvel article sur TechHeadBrothers sur les différents types
de concaténations en C#, leur implémentation en interne, les optimisations effectuées
par le compilateur ainsi qu’un bench des différentes méthodes afin de savoir quand
utiliser tel ou telle méthode.
</p>
        <p align="justify">
Vous pouvez le consulter ici : 
<br /><a href="http://www.techheadbrothers.com/Articles.aspx/concatenations-chaines-csharp">Article
sur THB</a></p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=50e0ee78-c445-4cb1-a7bd-0261b7517537" />
      </body>
      <title>Les concaténations de chaines en C#</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,50e0ee78-c445-4cb1-a7bd-0261b7517537.aspx</guid>
      <link>http://patricelamarche.net/2010/03/02/LesConcat%c3%a9nationsDeChainesEnC.aspx</link>
      <pubDate>Tue, 02 Mar 2010 13:39:22 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.techheadbrothers.com/Articles.aspx/concatenations-chaines-csharp"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/LesconcatnationsdechainesenC_CE16/image_3.png" width="534" height="303" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p align="justify"&gt;
Je viens de publier un nouvel article sur TechHeadBrothers sur les différents types
de concaténations en C#, leur implémentation en interne, les optimisations effectuées
par le compilateur ainsi qu’un bench des différentes méthodes afin de savoir quand
utiliser tel ou telle méthode.
&lt;/p&gt;
&lt;p align="justify"&gt;
Vous pouvez le consulter ici : 
&lt;br /&gt;
&lt;a href="http://www.techheadbrothers.com/Articles.aspx/concatenations-chaines-csharp"&gt;Article
sur THB&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=50e0ee78-c445-4cb1-a7bd-0261b7517537" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,50e0ee78-c445-4cb1-a7bd-0261b7517537.aspx</comments>
      <category>Articles</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=45e81fcd-3e37-409a-93a7-aa3510d3b501</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,45e81fcd-3e37-409a-93a7-aa3510d3b501.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,45e81fcd-3e37-409a-93a7-aa3510d3b501.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=45e81fcd-3e37-409a-93a7-aa3510d3b501</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="justify">
En C# si l’on souhaite utiliser le mot clé sizeof, la documentation précise <a href="http://awurl.com/bGmQsp5TF">qu’il
est nécessaire d’utiliser le mode unsafe</a> grâce au mot-clé du même nom.
</p>
        <p align="justify">
En effet, si l’on souhaite par exemple récupérer la taille d’une struct à l’aide de
ce mot-clé et non via l’utilisation de la classe Marshal il vous faudra écrire : 
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccfcc364-1252-48c2-b654-270c32ae5588" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">public struct MyStruct
{
    public int A;
    public int B;
}

class Program
{
    unsafe static void Main(string[] args)
    {
        int s = sizeof (MyStruct);
        Console.WriteLine(s.ToString());
    }
}</pre>
        </div>
        <p align="justify">
Mais bizarrement, si vous souhaitez faire un sizeof du type int, vous n’aurez pas
besoin d’utiliser de code unsafe et <a href="http://www.jetbrains.com/resharper/index.html">R#</a> indique
même que le mot-clé unsafe devrait être supprimé car redondant :
</p>
        <p>
          <a href="http://patricelamarche.net/content/binary/WindowsLiveWriter/motclsizeofetmodeunsafe_10780/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/motclsizeofetmodeunsafe_10780/image_thumb.png" width="405" height="160" />
          </a>
        </p>
        <p align="justify">
Mais comment ce contexte peut-il être redondant puisque nous n’avons utilisé le mot
clé unsafe qu’une seule fois, et qu’il ne l’était pas dans l’exemple précédent ? La
réponse est simple mais si elle n’est pas évidente au premier abord : il n’est plus
nécessaire depuis C# 2 de spécifier un contexte unsafe lors de l’utilisation de l’opérateur
sizeof sur les types .net prédéfinis.
</p>
        <p>
On peut d’ailleurs voir la différence de comportement du compilateur dans les deux
cas évoqués puisque lors de l’utilisation de l’opérateur sizeof sur le type int, le
compilo inline directement le résultat :
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fb9a1345-3c70-4240-acbe-383f15234f6c" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">private static void Main(string[] args)
{
    Console.WriteLine(4.ToString());
}</pre>
        </div>
        <p>
Tandis que lors de l’utilisation avec un type personnalisé, la valeur ne sera pas
inlinée, et le code généré fera appel à l’instruction sizeof présente dans l’Intermediate
Language :
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0441f753-895e-4690-a6a2-5a86c8ddb355" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">private static void Main(string[] args)
{
    Console.WriteLine(sizeof(MyStruct).ToString());
}</pre>
        </div>
        <p>
        </p>
        <p>
Pour plus d’infos : 
<br /><a href="http://blogs.msdn.com/abhinaba/archive/2006/02/24/538525.aspx">http://blogs.msdn.com/abhinaba/archive/2006/02/24/538525.aspx</a></p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=45e81fcd-3e37-409a-93a7-aa3510d3b501" />
      </body>
      <title>Mot-clé sizeof et mode unsafe</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,45e81fcd-3e37-409a-93a7-aa3510d3b501.aspx</guid>
      <link>http://patricelamarche.net/2009/08/11/Motcl%c3%a9SizeofEtModeUnsafe.aspx</link>
      <pubDate>Tue, 11 Aug 2009 17:30:40 GMT</pubDate>
      <description>&lt;p align="justify"&gt;
En C# si l’on souhaite utiliser le mot clé sizeof, la documentation précise &lt;a href="http://awurl.com/bGmQsp5TF"&gt;qu’il
est nécessaire d’utiliser le mode unsafe&lt;/a&gt; grâce au mot-clé du même nom.
&lt;/p&gt;
&lt;p align="justify"&gt;
En effet, si l’on souhaite par exemple récupérer la taille d’une struct à l’aide de
ce mot-clé et non via l’utilisation de la classe Marshal il vous faudra écrire : 
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccfcc364-1252-48c2-b654-270c32ae5588" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public struct MyStruct
{
    public int A;
    public int B;
}

class Program
{
    unsafe static void Main(string[] args)
    {
        int s = sizeof (MyStruct);
        Console.WriteLine(s.ToString());
    }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;
Mais bizarrement, si vous souhaitez faire un sizeof du type int, vous n’aurez pas
besoin d’utiliser de code unsafe et &lt;a href="http://www.jetbrains.com/resharper/index.html"&gt;R#&lt;/a&gt; indique
même que le mot-clé unsafe devrait être supprimé car redondant :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://patricelamarche.net/content/binary/WindowsLiveWriter/motclsizeofetmodeunsafe_10780/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/motclsizeofetmodeunsafe_10780/image_thumb.png" width="405" height="160" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;
Mais comment ce contexte peut-il être redondant puisque nous n’avons utilisé le mot
clé unsafe qu’une seule fois, et qu’il ne l’était pas dans l’exemple précédent ? La
réponse est simple mais si elle n’est pas évidente au premier abord : il n’est plus
nécessaire depuis C# 2 de spécifier un contexte unsafe lors de l’utilisation de l’opérateur
sizeof sur les types .net prédéfinis.
&lt;/p&gt;
&lt;p&gt;
On peut d’ailleurs voir la différence de comportement du compilateur dans les deux
cas évoqués puisque lors de l’utilisation de l’opérateur sizeof sur le type int, le
compilo inline directement le résultat :
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fb9a1345-3c70-4240-acbe-383f15234f6c" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;private static void Main(string[] args)
{
    Console.WriteLine(4.ToString());
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Tandis que lors de l’utilisation avec un type personnalisé, la valeur ne sera pas
inlinée, et le code généré fera appel à l’instruction sizeof présente dans l’Intermediate
Language :
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0441f753-895e-4690-a6a2-5a86c8ddb355" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;private static void Main(string[] args)
{
    Console.WriteLine(sizeof(MyStruct).ToString());
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Pour plus d’infos : 
&lt;br /&gt;
&lt;a href="http://blogs.msdn.com/abhinaba/archive/2006/02/24/538525.aspx"&gt;http://blogs.msdn.com/abhinaba/archive/2006/02/24/538525.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=45e81fcd-3e37-409a-93a7-aa3510d3b501" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,45e81fcd-3e37-409a-93a7-aa3510d3b501.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=c44d157c-8520-4f99-8313-9873bc8221c6</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,c44d157c-8520-4f99-8313-9873bc8221c6.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,c44d157c-8520-4f99-8313-9873bc8221c6.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c44d157c-8520-4f99-8313-9873bc8221c6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Lors de la PDC plusieurs démonstrations ont été faites à propos des nouvelles fonctionnalités
dynamiques apportées à C# 4. Pour créer une classe dont le comportement peut s'apparenter
aux types manipulés par les langages dynamiques, Microsoft a ajouté une interface
IDynamicObject à implémenter afin de pouvoir appeler des propriétés, méthodes, champs
non présents lors de la compilation. Lors de ces démonstrations, on a pu voir les
différents Microsoftees utiliser une classe de base DynamicObject afin de bénéficier
d'une implémentation par défaut. Cette classe DynamicObject n'est malheureusement
pas disponible au sein du framework .net 4.0 tel que livré par Microsoft au sein de
la CTP de Septembre.
</p>
        <p>
Néammoins,  une bonne âme a bien voulu livrer les sources de cette classe afin
d'être capable d'écrire du code se rapprochant des démos effectuées lors de la PDC
: <a title="http://hagenlocher.org/software/DynamicObject.cs.txt" href="http://hagenlocher.org/software/DynamicObject.cs.txt">http://hagenlocher.org/software/DynamicObject.cs.txt</a></p>
        <p>
Source:<br /><a href="http://blogs.msdn.com/curth/archive/2008/11/07/dynamicobject.aspx">http://blogs.msdn.com/curth/archive/2008/11/07/dynamicobject.aspx</a></p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=c44d157c-8520-4f99-8313-9873bc8221c6" />
      </body>
      <title>[C# 4] Où se trouve la classe DynamicObject</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,c44d157c-8520-4f99-8313-9873bc8221c6.aspx</guid>
      <link>http://patricelamarche.net/2008/11/20/C4O%c3%b9SeTrouveLaClasseDynamicObject.aspx</link>
      <pubDate>Thu, 20 Nov 2008 11:50:05 GMT</pubDate>
      <description>&lt;p&gt;
Lors de la PDC plusieurs démonstrations ont été faites à propos des nouvelles fonctionnalités
dynamiques apportées à C# 4. Pour créer une classe dont le comportement peut s'apparenter
aux types manipulés par les langages dynamiques, Microsoft a ajouté une interface
IDynamicObject à implémenter afin de pouvoir appeler des propriétés, méthodes, champs
non présents lors de la compilation. Lors de ces démonstrations, on a pu voir les
différents Microsoftees utiliser une classe de base DynamicObject afin de bénéficier
d'une implémentation par défaut. Cette classe DynamicObject n'est malheureusement
pas disponible au sein du framework .net 4.0 tel que livré par Microsoft au sein de
la CTP de Septembre.
&lt;/p&gt;
&lt;p&gt;
Néammoins,&amp;nbsp; une bonne âme a bien voulu livrer les sources de cette classe afin
d'être capable d'écrire du code se rapprochant des démos effectuées lors de la PDC
: &lt;a title="http://hagenlocher.org/software/DynamicObject.cs.txt" href="http://hagenlocher.org/software/DynamicObject.cs.txt"&gt;http://hagenlocher.org/software/DynamicObject.cs.txt&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Source:&lt;br&gt;
&lt;a href="http://blogs.msdn.com/curth/archive/2008/11/07/dynamicobject.aspx"&gt;http://blogs.msdn.com/curth/archive/2008/11/07/dynamicobject.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=c44d157c-8520-4f99-8313-9873bc8221c6" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,c44d157c-8520-4f99-8313-9873bc8221c6.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=e9e416b1-1c25-49b6-8146-6b8b3dbcb27e</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,e9e416b1-1c25-49b6-8146-6b8b3dbcb27e.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,e9e416b1-1c25-49b6-8146-6b8b3dbcb27e.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e9e416b1-1c25-49b6-8146-6b8b3dbcb27e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
En C# nous avons la possibilité de rajouter une virgule à la fin de la liste des valeurs
d’une enum. 
</p>
        <p>
Exemple : 
</p>
        <p>
          <a href="http://patricelamarche.net/content/binary/WindowsLiveWriter/CPourquoionpeutrajouterunevirgulelafindu_144B9/clip_image002_2.jpg">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="129" alt="clip_image002" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/CPourquoionpeutrajouterunevirgulelafindu_144B9/clip_image002_thumb.jpg" width="148" border="0" />
          </a> La
virgule après Buffering est accepté et le code compile sans aucun soucis. 
</p>
        <p>
La question qu’il est donc légitime de se poser est de savoir pouquoi le compilateur
C# si rigoureux habituellement est-il autant laxiste dans le cas donné ? 
</p>
        <p>
Encore une fois, il s’agit d’une raison historique qui tire son origine du langage
C++. 
</p>
        <p>
Le C++ permet en effet l’écriture de ce genre de code pour 3 raisons différentes : 
</p>
        <p>
· Faciliter la génération de code (pas besoin de supprimer le séparateur en fin de
boucle) 
</p>
        <p>
· Minimiser les changements lors d’ajout de valeur (une valeur ajouté correspond à
une ligne modifiée et non deux ce qui facilite la lecture des changesets) 
</p>
        <p>
· Permettre de définir des enums « bornées » où la dernière valeur correspond à la
dernière valeur (dans le cas où votre enum a une valeur de départ et une valeur de
fin). Si vous mettez une virgule après le dernier élément vous indiquez ainsi que
ce dernier élément n’est pas « sémantiquement » le dernier. 
</p>
        <p>
Cf révision 59 des specs du C++ : <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#518">http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#518</a></p>
        <p>
A noter que vous avez la même possibilité pour l’initialisation de tableaux ou pour
l’initialisation d’objets introduite par C#3.
</p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=e9e416b1-1c25-49b6-8146-6b8b3dbcb27e" />
      </body>
      <title>[C#] Pourquoi on peut rajouter une virgule à la fin d'une enum</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,e9e416b1-1c25-49b6-8146-6b8b3dbcb27e.aspx</guid>
      <link>http://patricelamarche.net/2008/11/19/CPourquoiOnPeutRajouterUneVirgule%c3%80LaFinDuneEnum.aspx</link>
      <pubDate>Wed, 19 Nov 2008 04:00:10 GMT</pubDate>
      <description>&lt;p&gt;
En C# nous avons la possibilité de rajouter une virgule à la fin de la liste des valeurs
d’une enum. 
&lt;p&gt;
Exemple : 
&lt;p&gt;
&lt;a href="http://patricelamarche.net/content/binary/WindowsLiveWriter/CPourquoionpeutrajouterunevirgulelafindu_144B9/clip_image002_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="129" alt="clip_image002" src="http://patricelamarche.net/content/binary/WindowsLiveWriter/CPourquoionpeutrajouterunevirgulelafindu_144B9/clip_image002_thumb.jpg" width="148" border="0"&gt;&lt;/a&gt; La
virgule après Buffering est accepté et le code compile sans aucun soucis. 
&lt;p&gt;
La question qu’il est donc légitime de se poser est de savoir pouquoi le compilateur
C# si rigoureux habituellement est-il autant laxiste dans le cas donné ? 
&lt;p&gt;
Encore une fois, il s’agit d’une raison historique qui tire son origine du langage
C++. 
&lt;p&gt;
Le C++ permet en effet l’écriture de ce genre de code pour 3 raisons différentes : 
&lt;p&gt;
· Faciliter la génération de code (pas besoin de supprimer le séparateur en fin de
boucle) 
&lt;p&gt;
· Minimiser les changements lors d’ajout de valeur (une valeur ajouté correspond à
une ligne modifiée et non deux ce qui facilite la lecture des changesets) 
&lt;p&gt;
· Permettre de définir des enums « bornées » où la dernière valeur correspond à la
dernière valeur (dans le cas où votre enum a une valeur de départ et une valeur de
fin). Si vous mettez une virgule après le dernier élément vous indiquez ainsi que
ce dernier élément n’est pas « sémantiquement » le dernier. 
&lt;p&gt;
Cf révision 59 des specs du C++ : &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#518"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#518&lt;/a&gt; 
&lt;p&gt;
A noter que vous avez la même possibilité pour l’initialisation de tableaux ou pour
l’initialisation d’objets introduite par C#3.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=e9e416b1-1c25-49b6-8146-6b8b3dbcb27e" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,e9e416b1-1c25-49b6-8146-6b8b3dbcb27e.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=2a906919-66e8-49b2-a061-4609c3c371e8</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,2a906919-66e8-49b2-a061-4609c3c371e8.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,2a906919-66e8-49b2-a061-4609c3c371e8.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2a906919-66e8-49b2-a061-4609c3c371e8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Lorsque l'on fait appel appel à la méthode Compile sur des regex le code généré est
chargé dans l'AppDomain courant et de ce fait ne peut être déchargé de la mémoire
tant que l'AppDomain est en vie. 
</p>
        <p>
La question que l'on est en droit de se poser et de savoir s'il en est de même pour
les expressions lambda introduites avec C# 3. 
</p>
        <p>
La réponse est simple : Concernant la méthode Compile qui concerne les expressions,
la génération du code se base sur les DynamicMethods (<a href="http://msdn2.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx">http://msdn2.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx</a>)
qui ont la bonne idée de permettre d’indiquer qu’une méthode générée est orpheline
(n’est plus référencée) et peut donc être collectée par le garbage collector.
</p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=2a906919-66e8-49b2-a061-4609c3c371e8" />
      </body>
      <title>[C#] Méthode Compile sur les expressions lambda</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,2a906919-66e8-49b2-a061-4609c3c371e8.aspx</guid>
      <link>http://patricelamarche.net/2008/05/22/CM%c3%a9thodeCompileSurLesExpressionsLambda.aspx</link>
      <pubDate>Thu, 22 May 2008 09:24:54 GMT</pubDate>
      <description>&lt;p&gt;
Lorsque l'on fait appel appel à la méthode Compile sur des regex le code généré est
chargé dans l'AppDomain courant et de ce fait ne peut être déchargé de la mémoire
tant que l'AppDomain est en vie. 
&lt;p&gt;
La question que l'on est en droit de se poser et de savoir s'il en est de même pour
les expressions lambda introduites avec C# 3. 
&lt;p&gt;
La réponse est simple : Concernant la méthode Compile qui concerne les expressions,
la génération du code se base sur les DynamicMethods (&lt;a href="http://msdn2.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx&lt;/a&gt;)
qui ont la bonne idée de permettre d’indiquer qu’une méthode générée est orpheline
(n’est plus référencée) et peut donc être collectée par le garbage collector.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=2a906919-66e8-49b2-a061-4609c3c371e8" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,2a906919-66e8-49b2-a061-4609c3c371e8.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=2caef05b-cb9d-4ebd-8a10-0821835899f9</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,2caef05b-cb9d-4ebd-8a10-0821835899f9.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,2caef05b-cb9d-4ebd-8a10-0821835899f9.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2caef05b-cb9d-4ebd-8a10-0821835899f9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Le langage C# 3 étant disponible depuis novembre 2007, L'équipe de développement du
langage C# commence petit à petit communiquer sur les pistes suivies pour implémenter
de nouvelles fonctionnalités dans la version 4. Charlie Calvert propose en effet une
série de posts afin de découvrir en avant première ce que nous reservera la prochaine
version d'un des langages phares de la plate-forme .net. 
</p>
        <p>
Le premier post de cette série concerne une fonctionnalité de Dynamic Lookup qui correspond
à la fonctionnalité de late binding que l'on a déjà depuis bien longtemps en Visual
Basic. Il sera donc prochainement possible de manipuler des types non connus à la
compilation et cela à moindre frais puisque l'équipe de C# va se baser sur la DLR
afin de proposer cette fonctionnalité. <a href="http://www.techheadbrothers.com/Articles.aspx/decouverte-projet-jasper">Développer
avec Jasper</a> avec du C# sera donc possible dans le futur ! 
</p>
        <p>
En savoir plus :<br /><a href="http://blogs.msdn.com/charlie/archive/tags/Future+Focus/default.aspx">http://blogs.msdn.com/charlie/archive/tags/Future+Focus/default.aspx</a></p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=2caef05b-cb9d-4ebd-8a10-0821835899f9" />
      </body>
      <title>[C#] Les nouveautes de C# 4</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,2caef05b-cb9d-4ebd-8a10-0821835899f9.aspx</guid>
      <link>http://patricelamarche.net/2008/02/02/CLesNouveautesDeC4.aspx</link>
      <pubDate>Sat, 02 Feb 2008 15:02:42 GMT</pubDate>
      <description>&lt;p&gt;
Le langage C# 3 étant disponible depuis novembre 2007, L'équipe de développement du
langage C# commence petit à petit communiquer sur les pistes suivies pour implémenter
de nouvelles fonctionnalités dans la version 4. Charlie Calvert propose en effet une
série de posts afin de découvrir en avant première ce que nous reservera la prochaine
version d'un des langages phares de la plate-forme .net. 
&lt;p&gt;
Le premier post de cette série concerne une fonctionnalité de Dynamic Lookup qui correspond
à la fonctionnalité de late binding que l'on a déjà depuis bien longtemps en Visual
Basic. Il sera donc prochainement possible de manipuler des types non connus à la
compilation et cela à moindre frais puisque l'équipe de C# va se baser sur la DLR
afin de proposer cette fonctionnalité. &lt;a href="http://www.techheadbrothers.com/Articles.aspx/decouverte-projet-jasper"&gt;Développer
avec Jasper&lt;/a&gt; avec du C# sera donc possible dans le futur ! 
&lt;p&gt;
En savoir plus :&lt;br&gt;
&lt;a href="http://blogs.msdn.com/charlie/archive/tags/Future+Focus/default.aspx"&gt;http://blogs.msdn.com/charlie/archive/tags/Future+Focus/default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=2caef05b-cb9d-4ebd-8a10-0821835899f9" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,2caef05b-cb9d-4ebd-8a10-0821835899f9.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=1c95b565-4af5-4197-903d-fb280af03424</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,1c95b565-4af5-4197-903d-fb280af03424.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,1c95b565-4af5-4197-903d-fb280af03424.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1c95b565-4af5-4197-903d-fb280af03424</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Depuis sa récente sortie en CTP, ParallelFX suscite un intérêt notable auprès des
développeurs et cela à juste titre. Si vous souhaitez tester ce framework vous pouvez
le télécharger à cette adresse : <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;displaylang=en">December
CTP de ParrelelFX</a> . A noter que le framework s'installe sans rien modifier sur
votre installation, il est simplement composé d'un ensemble d'assembly qu'il vous
suffit de référencer pour être prêt à développer. Il n'y a donc pas de risque à l'installer
sur son poste de développement. 
</p>
        <p>
Cependant, j'ai lu plusieurs fois sur des blogs fr et us qu'il était donc inutile
de tester ParallelFX sous une VPC. En réalité, le fait est qu'il <strong>NE FAUT PAS</strong> tester
ParallelFX sous une VPC puisque Virtual PC emule une architecture matériel monoprocesseur
monocoeur, vous n'allez pas pouvoir bénéficier des améliorations de performances proposées
par le framework, notamment la création automatique d'un certain nombre de threads
en fonction du nombre de processeurs ou coeurs que votre machine possède ! Le seul
intérêt à le faire serait d'analyser la très légère perte de performance qu'il peut
y avoir entre du code basé sur ParallelFX et du code "classique" sur un monoprocesseur
monocoeur ce qui n'est pas le but premier quand on souhaite découvrir ce framework. 
</p>
        <p>
En savoir plus : 
<br /><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;displaylang=en">December
CTP de ParrelelFX</a><br /><a href="http://www.techheadbrothers.com/Articles.aspx/decouverte-parallelfx">Article
d'introduction à ParallelFX</a></p>
        <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=1c95b565-4af5-4197-903d-fb280af03424" />
      </body>
      <title>[ParallelFX] Tester ParallelFX</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,1c95b565-4af5-4197-903d-fb280af03424.aspx</guid>
      <link>http://patricelamarche.net/2007/12/12/ParallelFXTesterParallelFX.aspx</link>
      <pubDate>Wed, 12 Dec 2007 07:21:26 GMT</pubDate>
      <description>&lt;p&gt;
Depuis sa récente sortie en CTP, ParallelFX suscite un intérêt notable auprès des
développeurs et cela à juste titre. Si vous souhaitez tester ce framework vous pouvez
le télécharger à cette adresse : &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;amp;displaylang=en"&gt;December
CTP de ParrelelFX&lt;/a&gt; . A noter que le framework s'installe sans rien modifier sur
votre installation, il est simplement composé d'un ensemble d'assembly qu'il vous
suffit de référencer pour être prêt à développer. Il n'y a donc pas de risque à l'installer
sur son poste de développement. 
&lt;p&gt;
Cependant, j'ai lu plusieurs fois sur des blogs fr et us qu'il était donc inutile
de tester ParallelFX sous une VPC. En réalité, le fait est qu'il &lt;strong&gt;NE FAUT PAS&lt;/strong&gt; tester
ParallelFX sous une VPC puisque Virtual PC emule une architecture matériel monoprocesseur
monocoeur, vous n'allez pas pouvoir bénéficier des améliorations de performances proposées
par le framework, notamment la création automatique d'un certain nombre de threads
en fonction du nombre de processeurs ou coeurs que votre machine possède ! Le seul
intérêt à le faire serait d'analyser la très légère perte de performance qu'il peut
y avoir entre du code basé sur ParallelFX et du code "classique" sur un monoprocesseur
monocoeur ce qui n'est pas le but premier quand on souhaite découvrir ce framework. 
&lt;p&gt;
En savoir plus : 
&lt;br&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;amp;displaylang=en"&gt;December
CTP de ParrelelFX&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.techheadbrothers.com/Articles.aspx/decouverte-parallelfx"&gt;Article
d'introduction à ParallelFX&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=1c95b565-4af5-4197-903d-fb280af03424" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,1c95b565-4af5-4197-903d-fb280af03424.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://patricelamarche.net/Trackback.aspx?guid=5f1503be-58a3-4d97-a631-6e7997e62a4a</trackback:ping>
      <pingback:server>http://patricelamarche.net/pingback.aspx</pingback:server>
      <pingback:target>http://patricelamarche.net/PermaLink,guid,5f1503be-58a3-4d97-a631-6e7997e62a4a.aspx</pingback:target>
      <dc:creator>Patrice Lamarche</dc:creator>
      <wfw:comment>http://patricelamarche.net/CommentView,guid,5f1503be-58a3-4d97-a631-6e7997e62a4a.aspx</wfw:comment>
      <wfw:commentRss>http://patricelamarche.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5f1503be-58a3-4d97-a631-6e7997e62a4a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Travaillant essentiellement sur Windows Presentation Foundation et Windows Workflow
Foundation, j'effectue quelques recherches et tests en ce moment sur les langages
déclaratifs. Ces deux technologies partagent en effet une nouveauté en matière de
développement : l'utilisation intensive de programmation déclarative qui vient le
plus souvent en complément de programmation impérative. 
</p>
        <p>
Un langage déclaratif permet de représenter sous forme d'un document XML un programme
qui pourrait être développé de la même manière sous forme impérative en C# ou en VB.net.
On peut citer l'exemple du XAML utilisé par WPF afin de définir des interfaces graphiques.
Comme indiqué ci-dessous, la création d'un bouton peut se faire comme auparavant avec
du code C# ou VB.net en instanciant un objet Button et en définissant les propriétés
souhaitées (comme le fait le designer Windows Forms de Visual Studio) ou alors sous
forme de balises XML ou l'on représente une instance de bouton via une balise Button
en définissant ses propriétés grâce à des attributs ou à des sous-éléments XML. 
</p>
        <p>
          <a href="http://patricelamarche.net/images/WindowsLiveWriter/CCreersonlangagedeclaratifoucommentcreer_9175/image.png">
            <img height="216" alt="image" src="http://patricelamarche.net/images/WindowsLiveWriter/CCreersonlangagedeclaratifoucommentcreer_9175/image_thumb.png" width="640" border="0" />
          </a>
        </p>
        <p>
La même représentation est possible avec Workflow Foundation puisque les workflows
peuvent être représentés sous forme de documents XOML complétés ou non par du code
impératif : 
</p>
        <p>
&lt;StateMachineWorkflowActivity x:Class="WorkflowLibrary1.Workflow2" Name="Workflow2"
InitialStateName="Workflow2InitialState" xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/workflow">http://schemas.microsoft.com/winfx/2006/xaml/workflow"</a> xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml"</a>&gt;<br />
&lt;StateActivity Name="Workflow2InitialState" /&gt;<br />
&lt;/StateMachineWorkflowActivity&gt; 
</p>
        <p>
Bien evidemment, la réalisation technique de cette implémentation sous forme déclarative
des objets proposés par Workflow Foundation et WPF ne s'est pas fait en réimplementant
la logique de ces classes une seconde fois mais uniquement en effectuant une sérialization
d'objets au format XML. 
</p>
        <p>
Le premier avantage direct de l'utilisation d'un tel style de développement est que
le code impératif est beaucoup plus facilement outillable que du code impératif. Ceux
d'entre-vous qui utilisent ou ont utilisé des générateurs de code en créant des templates
pour CodeSmith ou encore des templates T4 pour des packages GAT savent que générer
du code C# et/ou VB.net demande réflexion et n'est pas aussi simple qu'il n'y parait.<br />
La génération de documents XML est beaucoup plus simple et cela permet donc d'ouvrir
la génération de code au plus grand nombre. On peut citer l'exemple de WPF qui disposait
avant sa sortie d'un petit nombre d'outils capable de générer du XAML tels que des
éditeurs graphiques 2D comme Expression Design ou encore Expression Blend, des éditeurs
3D comme Aurora Mobiform et XAM3D, mais également des plug-ins pour des outils existants
comme 3D Studio MAX, Illustrator qui leur permettent d'exporter leurs documents sous
forme de document XAML et donc directement exploitable dans des applications WPF.<br />
Il en est de même avec Windows Workflow Foundation avec notamment l'outil Sharepoint
Designer qui permet de réaliser de manière visuelle des workflows, ces même workflows
étant en réalité générés sous forme déclarative. De même si vous avez l'habitude de
générer du code, vous pouvez très bien imaginer générer des interfaces graphiques
ou encore des workflows directement depuis votre outil de génération de code préféré. 
</p>
        <p>
Le second avantage est que si l'on ne souhaite pas utiliser la <strong>représentation</strong> (le
schéma) proposée par Microsoft, il est techniquement possible de créer sa propre représentation
tout en continuant d'utiliser le framework existant. Il est par exemple possible d'utilise
sa propre représentation sous forme XML afin de définir des workflows et de créer
son loader afin de charger le workflow et d'utiliser tout le reste du framework proposé
par Workflow Foundation afin d'héberger ses instances de workflow, les persister,
etc. Ainsi penser utiliser les capacités de Drawing ML proposé (entre autres) par
Visio afin de permettre à des utilisateurs finaux de représenter des Workflows sous
forme de diagramme et charger le document OpenXML ainsi produit par Visio afin d'en
faire un réél programme n'est pas illusoire et peut être tout à fait réalisable. 
</p>
        <p>
Cette programmation déclarative est relativement nouvelle et fait son apparition avec
le framework.net 3.0 grâce aux implémentations proposées par WPF et WF mais également
grâce à l'apparition d'un nouveau namespace : System.Windows.Markup. Ce namespace
est très interessant puisqu'il vous permet ni plus ni moins de créer votre propre
langage déclaratif de manière très simple ! 
</p>
        <p>
Ainsi si vous souhaitez être capable de représenter sous forme déclarative du code
utilisant votre framework interne afin d'être par exemple capable de créer un designer
graphique permettant de générer du code utilisant votre framework révolutionnaire,
vous pouvez le faire en utilisant deux classes de ce namespace : XamlReader et XamlWriter. 
</p>
        <p>
Prenons un exemple concre bien qu'ayant peu d'intéret en représentant un objet Guy
(personne) capable d'effectuer une action et notamment de parler (grâce aux capacités
de synthèse vocales fournies par le framework .net 3.0). 
</p>
        <p>
Un tel programme peut se représenter sous cette forme : 
</p>
        <p>
&lt;Guy xmlns="<a href="http://schemas.wygwam.com/guy">http://schemas.wygwam.com/guy"</a>&gt;<br />
&lt;Guy.Action&gt;<br />
&lt;Speak Message="Test Message"&gt;&lt;/Speak&gt;<br />
&lt;/Guy.Action&gt;<br />
&lt;/Guy&gt; 
</p>
        <p>
Afin d'être capable d'exécuter ce code, la première opération à réaliser est de définir
un namespace au document afin d'indiquer à la CLR quelle assembly et quel namespace
utiliser pour exécuter ce code. Une solution possible est utilisée par exemple par
WPF est d'utiliser une notation du type xmlns="clr-namespace:guy;assembly:guy". La
deuxième solution plus propre et plus portable est définir le namespace sous forme
d'uri http et d'effectuer le mapping du coté de votre framework en utilisant un attribut
assembly : [assembly:XmlnsDefinition("http://schemas.wygwam.com/guy","guy")] 
</p>
        <p>
Après avoir effectué ce "mapping" vous devez maintenant implémentez vos classes utilisées
dans le document XML afin d'être capable de les instancier : 
</p>
        <p>
using System;<br />
using System.Collections.Generic;<br />
using System.Text;<br />
using System.IO;<br />
using System.Windows.Markup;<br />
using System.Speech.Synthesis; 
</p>
        <p>
[assembly:XmlnsDefinition("<a href="http://schemas.wygwam.com/guy">http://schemas.wygwam.com/guy","guy")]</a><br />
namespace guy<br />
{<br />
public interface IExecutable<br />
{<br />
void Execute();<br />
} 
</p>
        <p>
public class Guy : IExecutable<br />
{<br />
private IExecutable m_test;<br />
public IExecutable Action<br />
{<br />
get { return m_test; }<br />
set { m_test = value; }<br />
} 
</p>
        <p>
public Guy()<br />
{ 
</p>
        <p>
} 
</p>
        <p>
public void Execute()<br />
{<br />
m_test.Execute();<br />
}<br />
} 
</p>
        <p>
public class Speak : IExecutable<br />
{<br />
private string m_test;<br />
private SpeechSynthesizer m_synth; 
</p>
        <p>
public string Message<br />
{<br />
get { return m_test; }<br />
set { m_test = value; }<br />
} 
</p>
        <p>
public Speak()<br />
{<br />
m_synth = new SpeechSynthesizer();<br />
m_synth.Volume = 50;<br />
m_synth.Rate = 5;<br />
} 
</p>
        <p>
public void Execute()<br />
{<br />
m_synth.SpeakAsync(m_test);<br />
}<br />
} 
</p>
        <p>
Il ne nous reste plus qu'à créer un loader capable de charger le document XML cité
ci-dessus et de l'exécuter. Pour cela rien de plus simple, une simple utilisation
de la classe XamlReader suffit pour charger le programme et ensuite l'exécuter : 
</p>
        <p>
public class Program<br />
{<br />
static void Main(string[] args)<br />
{<br />
IExecutable executable = XamlReader.Load(File.OpenRead("test.xaml")) as IExecutable;<br />
if (executable != null)<br />
{<br />
executable.Execute();<br />
} 
</p>
        <p>
}<br />
} 
</p>
        <p>
Vous voilà donc à présent en face de votre premier "langage" déclaratif !<br />
Pour aller plus loin il vous est tout à fait possible de créer un designer graphique
afin de générer ce code XML grâce à la classe XamlWriter... 
</p>
        <p>
Avec un peu de réflexion et d'abstraction, on se rapproche des fameux DSL introduits
par Microsoft avec Visual Studio 2005. Cette idée de créer des Domain Specific Languages
capable de représenter sous forme textuelle ou graphique des programmes tout en utilisant
son propre vocabulaire (par exemple graphique). 
</p>
        <p>
Nous sommes en effet capable de créer un modèle représenté sous forme de document
XML et d'exécuter de manière simple ce modèle. A noter qu'il est également possible
de définir le comportement de ce modèle grâce aux capacités de LINQ et ainsi traiter
le code comme de la donnée mais c'est une autre histoire que je vous détaillerais
dans un post dans les prochaines semaines.. <img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=5f1503be-58a3-4d97-a631-6e7997e62a4a" /></p>
      </body>
      <title>[C#] Creer son langage declaratif ou comment creer des modeles</title>
      <guid isPermaLink="false">http://patricelamarche.net/PermaLink,guid,5f1503be-58a3-4d97-a631-6e7997e62a4a.aspx</guid>
      <link>http://patricelamarche.net/2007/07/16/CCreerSonLangageDeclaratifOuCommentCreerDesModeles.aspx</link>
      <pubDate>Mon, 16 Jul 2007 14:59:48 GMT</pubDate>
      <description>&lt;p&gt;
Travaillant essentiellement sur Windows Presentation Foundation et Windows Workflow
Foundation, j'effectue quelques recherches et tests en ce moment sur les langages
déclaratifs. Ces deux technologies partagent en effet une nouveauté en matière de
développement : l'utilisation intensive de programmation déclarative qui vient le
plus souvent en complément de programmation impérative. 
&lt;p&gt;
Un langage déclaratif permet de représenter sous forme d'un document XML un programme
qui pourrait être développé de la même manière sous forme impérative en C# ou en VB.net.
On peut citer l'exemple du XAML utilisé par WPF afin de définir des interfaces graphiques.
Comme indiqué ci-dessous, la création d'un bouton peut se faire comme auparavant avec
du code C# ou VB.net en instanciant un objet Button et en définissant les propriétés
souhaitées (comme le fait le designer Windows Forms de Visual Studio) ou alors sous
forme de balises XML ou l'on représente une instance de bouton via une balise Button
en définissant ses propriétés grâce à des attributs ou à des sous-éléments XML. 
&lt;p&gt;
&lt;a href="http://patricelamarche.net/images/WindowsLiveWriter/CCreersonlangagedeclaratifoucommentcreer_9175/image.png"&gt;&lt;img height="216" alt="image" src="http://patricelamarche.net/images/WindowsLiveWriter/CCreersonlangagedeclaratifoucommentcreer_9175/image_thumb.png" width="640" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;
La même représentation est possible avec Workflow Foundation puisque les workflows
peuvent être représentés sous forme de documents XOML complétés ou non par du code
impératif : 
&lt;p&gt;
&amp;lt;StateMachineWorkflowActivity x:Class="WorkflowLibrary1.Workflow2" Name="Workflow2"
InitialStateName="Workflow2InitialState" xmlns="&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/workflow"&gt;http://schemas.microsoft.com/winfx/2006/xaml/workflow"&lt;/a&gt; xmlns:x="&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;http://schemas.microsoft.com/winfx/2006/xaml"&lt;/a&gt;&amp;gt;&lt;br&gt;
&amp;lt;StateActivity Name="Workflow2InitialState" /&amp;gt;&lt;br&gt;
&amp;lt;/StateMachineWorkflowActivity&amp;gt; 
&lt;p&gt;
Bien evidemment, la réalisation technique de cette implémentation sous forme déclarative
des objets proposés par Workflow Foundation et WPF ne s'est pas fait en réimplementant
la logique de ces classes une seconde fois mais uniquement en effectuant une sérialization
d'objets au format XML. 
&lt;p&gt;
Le premier avantage direct de l'utilisation d'un tel style de développement est que
le code impératif est beaucoup plus facilement outillable que du code impératif. Ceux
d'entre-vous qui utilisent ou ont utilisé des générateurs de code en créant des templates
pour CodeSmith ou encore des templates T4 pour des packages GAT savent que générer
du code C# et/ou VB.net demande réflexion et n'est pas aussi simple qu'il n'y parait.&lt;br&gt;
La génération de documents XML est beaucoup plus simple et cela permet donc d'ouvrir
la génération de code au plus grand nombre. On peut citer l'exemple de WPF qui disposait
avant sa sortie d'un petit nombre d'outils capable de générer du XAML tels que des
éditeurs graphiques 2D comme Expression Design ou encore Expression Blend, des éditeurs
3D comme Aurora Mobiform et XAM3D, mais également des plug-ins pour des outils existants
comme 3D Studio MAX, Illustrator qui leur permettent d'exporter leurs documents sous
forme de document XAML et donc directement exploitable dans des applications WPF.&lt;br&gt;
Il en est de même avec Windows Workflow Foundation avec notamment l'outil Sharepoint
Designer qui permet de réaliser de manière visuelle des workflows, ces même workflows
étant en réalité générés sous forme déclarative. De même si vous avez l'habitude de
générer du code, vous pouvez très bien imaginer générer des interfaces graphiques
ou encore des workflows directement depuis votre outil de génération de code préféré. 
&lt;p&gt;
Le second avantage est que si l'on ne souhaite pas utiliser la &lt;strong&gt;représentation&lt;/strong&gt; (le
schéma) proposée par Microsoft, il est techniquement possible de créer sa propre représentation
tout en continuant d'utiliser le framework existant. Il est par exemple possible d'utilise
sa propre représentation sous forme XML afin de définir des workflows et de créer
son loader afin de charger le workflow et d'utiliser tout le reste du framework proposé
par Workflow Foundation afin d'héberger ses instances de workflow, les persister,
etc. Ainsi penser utiliser les capacités de Drawing ML proposé (entre autres) par
Visio afin de permettre à des utilisateurs finaux de représenter des Workflows sous
forme de diagramme et charger le document OpenXML ainsi produit par Visio afin d'en
faire un réél programme n'est pas illusoire et peut être tout à fait réalisable. 
&lt;p&gt;
Cette programmation déclarative est relativement nouvelle et fait son apparition avec
le framework.net 3.0 grâce aux implémentations proposées par WPF et WF mais également
grâce à l'apparition d'un nouveau namespace : System.Windows.Markup. Ce namespace
est très interessant puisqu'il vous permet ni plus ni moins de créer votre propre
langage déclaratif de manière très simple ! 
&lt;p&gt;
Ainsi si vous souhaitez être capable de représenter sous forme déclarative du code
utilisant votre framework interne afin d'être par exemple capable de créer un designer
graphique permettant de générer du code utilisant votre framework révolutionnaire,
vous pouvez le faire en utilisant deux classes de ce namespace : XamlReader et XamlWriter. 
&lt;p&gt;
Prenons un exemple concre bien qu'ayant peu d'intéret en représentant un objet Guy
(personne) capable d'effectuer une action et notamment de parler (grâce aux capacités
de synthèse vocales fournies par le framework .net 3.0). 
&lt;p&gt;
Un tel programme peut se représenter sous cette forme : 
&lt;p&gt;
&amp;lt;Guy xmlns="&lt;a href="http://schemas.wygwam.com/guy"&gt;http://schemas.wygwam.com/guy"&lt;/a&gt;&amp;gt;&lt;br&gt;
&amp;lt;Guy.Action&amp;gt;&lt;br&gt;
&amp;lt;Speak Message="Test Message"&amp;gt;&amp;lt;/Speak&amp;gt;&lt;br&gt;
&amp;lt;/Guy.Action&amp;gt;&lt;br&gt;
&amp;lt;/Guy&amp;gt; 
&lt;p&gt;
Afin d'être capable d'exécuter ce code, la première opération à réaliser est de définir
un namespace au document afin d'indiquer à la CLR quelle assembly et quel namespace
utiliser pour exécuter ce code. Une solution possible est utilisée par exemple par
WPF est d'utiliser une notation du type xmlns="clr-namespace:guy;assembly:guy". La
deuxième solution plus propre et plus portable est définir le namespace sous forme
d'uri http et d'effectuer le mapping du coté de votre framework en utilisant un attribut
assembly : [assembly:XmlnsDefinition("http://schemas.wygwam.com/guy","guy")] 
&lt;p&gt;
Après avoir effectué ce "mapping" vous devez maintenant implémentez vos classes utilisées
dans le document XML afin d'être capable de les instancier : 
&lt;p&gt;
using System;&lt;br&gt;
using System.Collections.Generic;&lt;br&gt;
using System.Text;&lt;br&gt;
using System.IO;&lt;br&gt;
using System.Windows.Markup;&lt;br&gt;
using System.Speech.Synthesis; 
&lt;p&gt;
[assembly:XmlnsDefinition("&lt;a href="http://schemas.wygwam.com/guy"&gt;http://schemas.wygwam.com/guy","guy")]&lt;/a&gt;
&lt;br&gt;
namespace guy&lt;br&gt;
{&lt;br&gt;
public interface IExecutable&lt;br&gt;
{&lt;br&gt;
void Execute();&lt;br&gt;
} 
&lt;p&gt;
public class Guy : IExecutable&lt;br&gt;
{&lt;br&gt;
private IExecutable m_test;&lt;br&gt;
public IExecutable Action&lt;br&gt;
{&lt;br&gt;
get { return m_test; }&lt;br&gt;
set { m_test = value; }&lt;br&gt;
} 
&lt;p&gt;
public Guy()&lt;br&gt;
{ 
&lt;p&gt;
} 
&lt;p&gt;
public void Execute()&lt;br&gt;
{&lt;br&gt;
m_test.Execute();&lt;br&gt;
}&lt;br&gt;
} 
&lt;p&gt;
public class Speak : IExecutable&lt;br&gt;
{&lt;br&gt;
private string m_test;&lt;br&gt;
private SpeechSynthesizer m_synth; 
&lt;p&gt;
public string Message&lt;br&gt;
{&lt;br&gt;
get { return m_test; }&lt;br&gt;
set { m_test = value; }&lt;br&gt;
} 
&lt;p&gt;
public Speak()&lt;br&gt;
{&lt;br&gt;
m_synth = new SpeechSynthesizer();&lt;br&gt;
m_synth.Volume = 50;&lt;br&gt;
m_synth.Rate = 5;&lt;br&gt;
} 
&lt;p&gt;
public void Execute()&lt;br&gt;
{&lt;br&gt;
m_synth.SpeakAsync(m_test);&lt;br&gt;
}&lt;br&gt;
} 
&lt;p&gt;
Il ne nous reste plus qu'à créer un loader capable de charger le document XML cité
ci-dessus et de l'exécuter. Pour cela rien de plus simple, une simple utilisation
de la classe XamlReader suffit pour charger le programme et ensuite l'exécuter : 
&lt;p&gt;
public class Program&lt;br&gt;
{&lt;br&gt;
static void Main(string[] args)&lt;br&gt;
{&lt;br&gt;
IExecutable executable = XamlReader.Load(File.OpenRead("test.xaml")) as IExecutable;&lt;br&gt;
if (executable != null)&lt;br&gt;
{&lt;br&gt;
executable.Execute();&lt;br&gt;
} 
&lt;p&gt;
}&lt;br&gt;
} 
&lt;p&gt;
Vous voilà donc à présent en face de votre premier "langage" déclaratif !&lt;br&gt;
Pour aller plus loin il vous est tout à fait possible de créer un designer graphique
afin de générer ce code XML grâce à la classe XamlWriter... 
&lt;p&gt;
Avec un peu de réflexion et d'abstraction, on se rapproche des fameux DSL introduits
par Microsoft avec Visual Studio 2005. Cette idée de créer des Domain Specific Languages
capable de représenter sous forme textuelle ou graphique des programmes tout en utilisant
son propre vocabulaire (par exemple graphique). 
&lt;p&gt;
Nous sommes en effet capable de créer un modèle représenté sous forme de document
XML et d'exécuter de manière simple ce modèle. A noter qu'il est également possible
de définir le comportement de ce modèle grâce aux capacités de LINQ et ainsi traiter
le code comme de la donnée mais c'est une autre histoire que je vous détaillerais
dans un post dans les prochaines semaines.. &lt;img width="0" height="0" src="http://patricelamarche.net/aggbug.ashx?id=5f1503be-58a3-4d97-a631-6e7997e62a4a" /&gt;</description>
      <comments>http://patricelamarche.net/CommentView,guid,5f1503be-58a3-4d97-a631-6e7997e62a4a.aspx</comments>
      <category>C#</category>
      <category>XAML</category>
    </item>
  </channel>
</rss>