<?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>Eric de C#</title>
	<atom:link href="https://blog.decarufel.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.decarufel.net</link>
	<description>A C# developer blog</description>
	<lastBuildDate>Mon, 24 Apr 2017 10:39:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>

<image>
	<url>/wp-content/uploads/2017/02/cropped-Copie-de-IMG_07161-32x32.jpg</url>
	<title>Eric de C#</title>
	<link>https://blog.decarufel.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Quoi de neuf dans Visual Studio 2017</title>
		<link>https://blog.decarufel.net/2017/04/24/quoi-de-neuf-dans-visual-studio-2017/</link>
		<comments>https://blog.decarufel.net/2017/04/24/quoi-de-neuf-dans-visual-studio-2017/#respond</comments>
		<pubDate>Mon, 24 Apr 2017 10:00:47 +0000</pubDate>
		<dc:creator><![CDATA[Eric De C#]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.decarufel.net/?p=1337</guid>
		<description><![CDATA[Survol de nouvelles fonctionnalités de Visual Studio 2017 Mise en contexte Le 7 mars 2017 nous a amené la version 2017 de Visual Studio, toujours disponible en version Community, Professional ...]]></description>
				<content:encoded><![CDATA[<p>Survol de nouvelles fonctionnalités de Visual Studio 2017</p>
<p><iframe width="800" height="450" src="https://www.youtube.com/embed/2QEGSuO72Sc?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h2><a id="user-content-mise-en-contexte" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#mise-en-contexte"></a>Mise en contexte</h2>
<p>Le 7 mars 2017 nous a amené la version 2017 de Visual Studio, toujours disponible en version Community, Professional et Enterprise.</p>
<p>Voici donc les fonctionnalités qui ont retenu notre attention et qui vont fort probablement vous aider dans vos projets.</p>
<h2><a id="user-content-linstallation" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#linstallation"></a>L&#8217;installation</h2>
<p>Avant même de parler de ce que Visual Studio 2017 va vous apporter, on peut parler de l&#8217;installateur, qui a été complètement refait. Il est maintenant plus facile de sélectionner individuellement les composantes que nous avons besoin, ou encore de les ajouter via des &#8220;Workloads&#8221;, qui sont essentiellement des regroupements de composantes nécessaires selon certains besoins. Par exemple, et vous pouvez le constater avec les captures d&#8217;écran ci-bas, le workload &#8220;Universal Windows Platform development&#8221; nous sélectionnera les versions du framework, le compilateur et tous les outils nécessaires à ce type de projet.</p>
<h5><a id="user-content-workloads" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#workloads"></a>Workloads</h5>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/workload.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/workload.png" alt="Workload" /></a></p>
<h5><a id="user-content-composantes" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#composantes"></a>Composantes</h5>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/composantes.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/composantes.png" alt="Composantes" /></a></p>
<p>Un autre élément qu&#8217;on peut noter (que vous pouvez voir sur les captures) est qu&#8217;il est possible de donner un &#8220;nickname&#8221; à notre installation. Puisqu&#8217;il est possible d&#8217;installer deux versions de Visual Studio 2017 sur le même ordinateur (Community et Professional, par exemple), il est donc possible de donner un surnom à l&#8217;installation, pour permettre de facilement les distinguer dans le menu de démarrage.</p>
<h2><a id="user-content-améliorations-de-lide" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#améliorations-de-lide"></a>Améliorations de l&#8217;IDE</h2>
<p>Une des plus grandes améliorations qu&#8217;on peut voir dans cette nouvelle version est la performance. Un gros travail d&#8217;optimisation a été fait pour réduire le temps de démarrage et le temps de chargement des solutions. Selon Microsoft, le temps de démarrage serait 50% plus rapide qu&#8217;avant lors de la première utilisation.</p>
<p>Pour bien le constater, j&#8217;ai fait le test de comparer l&#8217;ouverture d&#8217;une solution sur laquelle j&#8217;ai travaillé récemment, qui contenait 15 projets. Pour un temps d&#8217;ouverture d&#8217;environ 10 secondes avec Visual Studio 2015, on passait à seulement 6 secondes avec la version 2017.</p>
<p>Malgré cette différence assez notable, je me suis demandé si l&#8217;option de &#8220;Lightweight Solution Load&#8221;, qui a été ajoutée pour permettre de charger plus rapidement et pour mieux utiliser la mémoire, pourrait me permettre d&#8217;améliorer ce temps. J&#8217;ai donc activé l&#8217;option pour ma solution (cette option n&#8217;est pas activée par défaut) et refait le test, pour en arriver à un temps d&#8217;ouverture de 3 secondes.</p>
<p>L&#8217;idée en arrière de cette option est de ne pas totalement charger les projets de la solution tant qu&#8217;on ne commence pas à les utiliser. La navigation à travers le code pourra donc se faire très rapidement après le démarrage, et il ne sera pas nécessaire d&#8217;atteindre que nos 15 projets soient chargés avant de commencer à travailler dans celui où nous voulons faire du code.</p>
<p>Je vous laisse le soin de faire le test avec vos solutions, mais je crois qu&#8217;on peut considérer l&#8217;objectif de performance comme atteint !</p>
<h2><a id="user-content-page-de-démarrage" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#page-de-démarrage"></a>Page de démarrage</h2>
<p>Beaucoup de changements sur cette page qui nous est offerte à l&#8217;ouverture de l&#8217;application. Un premier changement, quoique mineur, est la possibilité de cacher la section &#8220;Developer News&#8221;. Pour ceux qui ne consultent pas ces nouvelles, cela permettra de laisser toute la place aux récents projets et à la création de nouveaux.</p>
<p>Parlant de nouveaux projets, nous avons là un changement qui sera selon moi le bienvenue pour beaucoup de gens. Dans les versions précédantes de Visual Studio, la création d&#8217;un nouveau projet nous ouvrait tout simplement le dialogue de sélection de gabarit de projet.</p>
<p>Avec 2017, une section de la page est maintenant dédiée à la création de projets, en nous permettant de choisir parmis les gabarits de projets récemment utilisés</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/recent.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/recent.png" alt="Recent" /></a></p>
<p>ou encore avec la barre de recherche de gabarit.</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/recherche.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/recherche.png" alt="Recherche" /></a></p>
<p>Dans la majorité des cas, il sera donc possible de démarrer un nouveau projet directement à partir de cet écran.</p>
<h2><a id="user-content-navigation-de-code" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#navigation-de-code"></a>Navigation de code</h2>
<p>Beaucoup de choses ont été mises en place pour améliorer la navigation dans notre code.</p>
<h5><a id="user-content-go-to-all" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#go-to-all"></a>Go To All</h5>
<p>La première est la fonction de &#8220;Go To All&#8221;, qui nous amène ce dialogue de recherche: <a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/gotoall.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/gotoall.png" alt="Gotoall" /></a></p>
<p>Il est donc possible à partir de cette barre de recherche de chercher à travers tous les types, membres, fichiers et d&#8217;accéder à la classe. Plus besoin de naviguer vers la classe en passant par l&#8217;explorateur de solution, tout pourra se faire sans que nos doigts quittent le clavier.</p>
<h5><a id="user-content-find-all-references" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#find-all-references"></a>Find All References</h5>
<p>Le panneau pour trouver toutes les références est fréquemment utilisé pour avoir une liste de toutes les références à une classe ou un objet. Jusqu&#8217;à Visual Studio 2017, cette liste de résultats pouvait nous donner l&#8217;information sur le projet et le fichier où la référence était, mais simplement par le texte contenu dans la ligne affichée sur la référence.</p>
<p>Souhaitons donc la bienvenue à ce panneau, version améliorée: <a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/findallreferences.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/findallreferences.png" alt="Findallreferences" /></a></p>
<p>On peut tout d&#8217;abord remarquer qu&#8217;il est possible de grouper les résultats de la recherche. Cette capture montre un groupement par projet puis par définition, mais plusieurs autres options s&#8217;offrent à nous pour grouper selon nos besoins. On remarque aussi la colorisation des résultats, pour aider à comprendre le contexte de la référence qui nous est affichée, qu&#8217;on retrouve également dans l&#8217;affichage de l&#8217;extrait du code entourant la référence.</p>
<h5><a id="user-content-structure-guide-lines" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#structure-guide-lines"></a>Structure Guide Lines</h5>
<p>Dans sa plus simple utilisation, cette fonctionnalité nous permet d&#8217;avoir un indicatif visuel pour nous aider à visualiser la strucutre de notre code. La valeur ajoutée de ceci nous vient lorsqu&#8217;on dépose le curseur de notre souris sur ces lignes. En effet, une info-bulle nous sera affichée, avec le début de notre bloc de code et de ses blocs parents. Il est donc possible de voir facilement le contexte de notre bloc de code, sans avoir à naviguer de bas en haut et de haut en bas dans notre fichier. <a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/guidelines.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/guidelines.png" alt="Guidelines" /></a></p>
<h2><a id="user-content-ouverture-de-dossiers" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#ouverture-de-dossiers"></a>Ouverture de dossiers</h2>
<p>La polyvalence faisant partie intégrale de notre métier, il arrive parfois que nous devons travailler sur autre chose qu&#8217;une solution faite en .NET. Avec cette nouvelle version de Visual Studio, il nous est maintenant possible d&#8217;ouvrir le dossier de ces projets (un projet PHP par exemple), et d&#8217;y travailler, avec surbrillance de la syntaxe et beaucoup de fonctionnalités comme la navigation et la recherche à travers le dossier.</p>
<p>Il est même possible d&#8217;ouvrir un dossier dans Visual Studio directement à partir de l&#8217;explorateur de fichier, avec une nouvelle commande ajoutée au menu contextuel.</p>
<h2><a id="user-content-actions-rapides-et-refactoring" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#actions-rapides-et-refactoring"></a>Actions rapides et refactoring</h2>
<p>Plusieurs options de refactoring se sont ajoutées avec cette nouvelle version, dont certaines reliées aux changements que C#7 apporte. En voici quelques-unes qui ont retenu mon attention, puisqu&#8217;avant, il nous était seulement possible de bénéficier de celles-ci avec l&#8217;aide d&#8217;un outil additionnel comme Resharper.</p>
<h5><a id="user-content-simplifier-linitialisation-de-variables-avec-un-initialiseur" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#simplifier-linitialisation-de-variables-avec-un-initialiseur"></a>Simplifier l&#8217;initialisation de variables avec un initialiseur</h5>
<p>Lorsqu&#8217;on a un objet à initialiser avec plusieurs propriétés, il est préférable d&#8217;utiliser l&#8217;initialiseur, pour vraiment encapsuler l&#8217;initialisation de notre variable, et pour éviter de répéter le nom de la variable inutilement. L&#8217;option de refactoring vient donc nous aider à rapidement mettre ceci en place, comme vous pouvez le voir avec cette capture d&#8217;écran:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/initializer.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/initializer.png" alt="Initializer" /></a></p>
<h5><a id="user-content-déplacer-les-variables-out-inline" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#déplacer-les-variables-out-inline"></a>Déplacer les variables &#8220;out&#8221; inline</h5>
<p>Une des nouvelles fonctionnalités de C#7 est de pouvoir déclarer les variables &#8220;out&#8221; directement dans la fonction l&#8217;utilisant (un TryParse, par exemple). L&#8217;option de refactoring nous est donc offerte par Visual Studio pour simplifier ceci:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/inlineoutvariable.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/inlineoutvariable.png" alt="Inlineoutvariable" /></a></p>
<h5><a id="user-content-utilisation-des-expressions-de-throw" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#utilisation-des-expressions-de-throw"></a>Utilisation des expressions de Throw</h5>
<p>Une autre des nouvelles fonctionnalités de C#7 est de pouvoir directement lancer une exception avec l&#8217;opérateur de fusion Null (null-coalescing), au lieu du traditionnel &#8220;if&#8221; qui vérifie si la variable est nulle. Visual Studio nous offre donc l&#8217;option de faire le refactoring là-dessus, comme démontré ci-dessous:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/throw-expression.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/throw-expression.png" alt="Throw Expression" /></a></p>
<h5><a id="user-content-déplacer-un-type-vers-un-fichier-correspondant" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#déplacer-un-type-vers-un-fichier-correspondant"></a>Déplacer un type vers un fichier correspondant</h5>
<p>Il nous arrive parfois, dans le feu de l&#8217;action, de déclarer plus d&#8217;un type à l&#8217;intérieur du même fichier. Avant Visual Studio 2017, pour le déplacer, nous devions passer par l&#8217;ajout d&#8217;un item dans notre projet, nommé de la même manière que le type en question, couper notre type déclaré et le coller à l&#8217;intérieur du nouveau fichier créé, écrasant la déclaration vide. Maintenant, il nous suffit d&#8217;utiliser l&#8217;option de refactoring que Visual Studio nous offre et le tout se fera automatiquement.</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/movetype.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/movetype.png" alt="Movetype" /></a></p>
<h5><a id="user-content-synchroniser-le-nom-dun-fichier-et-dun-type" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#synchroniser-le-nom-dun-fichier-et-dun-type"></a>Synchroniser le nom d&#8217;un fichier et d&#8217;un type</h5>
<p>Il nous arrive tous à un moment ou un autre de devoir renommer une classe, et pour garder le nom du fichier identique, il fallait manuellement renommer le fichier au niveau de l&#8217;explorateur de solution. Nous avons maintenant la possibilité de faire l&#8217;opération de synchroniser les deux, d&#8217;un côté comme de l&#8217;autre, directement à partir des options de refactoring:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/sync-type-file.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/sync-type-file.png" alt="Sync Type File" /></a></p>
<h5><a id="user-content-conversion-de-stringformat-en-interpolation-de-chaîne" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#conversion-de-stringformat-en-interpolation-de-chaîne"></a>Conversion de String.Format en interpolation de chaîne</h5>
<p>C#6 nous avait amené la fonction d&#8217;interpolation de chaîne, qui nous permet d&#8217;écrire une chaîne de caractères en y insérant des variables inline, au lieu du traditionnel String.Format:</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">var</span> <span class="pl-en">name </span>= <span class="pl-pds">$"</span><span class="pl-s">Mon nom est </span>{person.FirstName} {person.LastName}<span class="pl-pds">"</span>;</pre>
</div>
<p>Il nous est donc possible d&#8217;utiliser ceci depuis quelques temps déjà, mais l&#8217;option de refactoring vers l&#8217;interpolation n&#8217;était pas disponible, à moins d&#8217;avoir un outil (et des coûts supplémentaires) comme Resharper. Aujourd&#8217;hui, l&#8217;option nous est finalement accessible:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/interpolation.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/interpolation.png" alt="Interpolation" /></a></p>
<h2><a id="user-content-filtres-sur-lintellisense" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#filtres-sur-lintellisense"></a>Filtres sur l&#8217;IntelliSense</h2>
<p>Une grande amélioration au niveau de l&#8217;IntelliSense nous permet maintenant de filtrer ce qui nous est affiché, pour par exemple voir seulement les classes, les structures, ou encore les variables locales. Ces options de filtres sont d&#8217;ailleurs accessibles avec des raccourçis de clavier, donc tout ceci peut se faire sans que nos mains quittent le clavier.</p>
<h2><a id="user-content-débogage" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#débogage"></a>Débogage</h2>
<h5><a id="user-content-run-to-click" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#run-to-click"></a>Run to click</h5>
<p>Le temps est breakpoint temporaires, qui servaient seulement à nous amener à un endroit précis lors de débogages, est révolu. Du moment où nous sommes en état d&#8217;arrêt à l&#8217;intérieur du code, un icône sera accessible à gauche de n&#8217;importe quelle ligne où on met notre curseur, et en un simple clic, l&#8217;exécution se fera jusqu&#8217;à cette ligne:</p>
<p><a href="https://github.com/BracketShow/VisualStudio2017/blob/master/images/run-to-click.png" target="_blank" rel="noopener noreferrer"><img src="https://github.com/BracketShow/VisualStudio2017/raw/master/images/run-to-click.png" alt="Run To Click" /></a></p>
<h2><a id="user-content-assistant-dexception-amélioré" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#assistant-dexception-amélioré"></a>Assistant d&#8217;exception amélioré</h2>
<p>Le premier changement que vous pourrez remarquer avec cette nouvelle version d&#8217;assistant d&#8217;exception est que la fenêtre n&#8217;est plus modale.</p>
<p>Un autre aspect très utile concerne les exceptions imbriquées, qui sont maintenant accessibles directement à partir de l&#8217;assistant. Plus besoin d&#8217;ouvrir l&#8217;objet de l&#8217;exception pour aller voir sa propriété InnerException (et potentiellement ses exceptions imbriquées).</p>
<h2><a id="user-content-le-roaming-extension-manager" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#le-roaming-extension-manager"></a>Le Roaming Extension Manager</h2>
<p>Nous avons tous certaines extensions de Visual Studio que nous utilisons partout où nous allons, qu&#8217;il faut réinstaller chaque fois qu&#8217;on accède un nouveau poste, ou encore si on doit réinstaller notre ordinateur. Grâce au Roaming Extension Manager, les extensions que nous désignerons pour être &#8220;roaming&#8221; seront automatiquement synchronisées dans le cloud et réinstallées dès que vous serez connectés à votre compte Visual Studio.</p>
<h2><a id="user-content-conclusion" class="anchor" href="https://github.com/BracketShow/VisualStudio2017#conclusion"></a>Conclusion</h2>
<p>Ces changements ne sont qu&#8217;une partie des changements que Visual Studio 2017 nous amène. Mais avec le petit survol que nous venons de faire, je crois qu&#8217;il est facile de constater que beaucoup d&#8217;efforts ont été mis pour améliorer notre expérience d&#8217;utilisation et nous faciliter la vie dans notre travail au quotidien.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.decarufel.net/2017/04/24/quoi-de-neuf-dans-visual-studio-2017/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quoi de neuf dans C# 7.0</title>
		<link>https://blog.decarufel.net/2017/03/21/quoi-de-neuf-dans-c-7-0/</link>
		<comments>https://blog.decarufel.net/2017/03/21/quoi-de-neuf-dans-c-7-0/#respond</comments>
		<pubDate>Wed, 22 Mar 2017 02:43:47 +0000</pubDate>
		<dc:creator><![CDATA[Eric De C#]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.decarufel.net/?p=1330</guid>
		<description><![CDATA[Quoi de neuf dans C# 7.0 Les nouvelles fonctionnalités de C# 7.0 expliquées et commentées Mise en contexte Le 7 Mars 2017 Microsoft lançait Visual Studio 2017 et du même ...]]></description>
				<content:encoded><![CDATA[<h1>Quoi de neuf dans C# 7.0</h1>
<p>Les nouvelles fonctionnalités de C# 7.0 expliquées et commentées</p>
<p><iframe width="800" height="450" src="https://www.youtube.com/embed/2LhU3k44kJY?feature=oembed" frameborder="0" allowfullscreen></iframe><br />
<iframe width="800" height="450" src="https://www.youtube.com/embed/YgeVjxI4zCY?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h2><a id="user-content-mise-en-contexte" class="anchor" href="https://github.com/BracketShow/CSharp7#mise-en-contexte"></a>Mise en contexte</h2>
<p>Le 7 Mars 2017 Microsoft lançait Visual Studio 2017 et du même coup C# 7.0. Depuis que Microsoft a complètement réécrit le compilateur C# en C# de nouvelles fonctionnalités ne cessent d’être ajouté au langage. Le virage Agile que les groupe de produits de Microsoft ont adopté contribuent également à cette effervescence. De plus, Microsoft code maintenant dans l’open source. Vous pouvez d’ailleurs suivre le projet sur GitHub et même qui sait, y contribuer.</p>
<p>C# 6.0 nous avais déjà apporté son lot de nouveautés mais C# 7.0 pousse la note encore plus loin.</p>
<p>J’aimerais vous présenter les nouveautés de C# 7.0 et mon opinion sur leur utilisation.</p>
<h2><a id="user-content-les-variables-de-sortie-out-variables" class="anchor" href="https://github.com/BracketShow/CSharp7#les-variables-de-sortie-out-variables"></a>Les variables de sortie (out variables)</h2>
<p>Pour commencer, j’aimerais vous dire que dans la plupart des cas, c’est une mauvaise pratique que d’utiliser des variables out dans vos méthodes. Il existe cependant un cas de figure classique où il est approprié de les utiliser. Il s’agit du <em>try pattern</em>. Dans ce patron la méthode retourne un booléen pour annoncer la réussite de l’action et elle retourne le résultat du traitement dans une variable out. Le plus classique des cas est dans les méthodes <em>TryParse</em> des différents types du <em>Framework</em>.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">int</span> <span class="pl-en">index</span>;
<span class="pl-k">if</span> (<span class="pl-en">Int32.TryParse</span>("1", out index))
{
	Console.WriteLine(<span class="pl-pds">$"</span><span class="pl-s">Index is </span>{index}<span class="pl-pds">"</span>);
}</pre>
</div>
<p>Avant C# 7.0 nous devions absolument déclarer une variable pour contenir le résultat du paramètre <em>out</em>. Maintenant nous pouvons déclarer la variable au moment de sont passage en paramètre.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">if</span> (<span class="pl-en">Int32.TryParse</span>("1", out int index))
{
    Console.WriteLine(<span class="pl-pds">$"</span><span class="pl-s">Index is </span>{index}<span class="pl-pds">"</span>);
}</pre>
</div>
<p>En plus d&#8217;éviter de faire une déclaration sur une ligne sans assigner de valeur à la variable, cette méthode permet de restreindre la portée de la variable. En effet, la variable étant déclaré à l&#8217;intérieur de la clause conditionnelle elle a une portée définie uniquement à l&#8217;intérieur de celle-ci. Dès la sortie du bloc de code associé à la condition, la variable est relâchée.</p>
<h2><a id="user-content-le-pattern-matching" class="anchor" href="https://github.com/BracketShow/CSharp7#le-pattern-matching"></a>Le <em>pattern matching</em></h2>
<p>La notion de <em>patterns</em> introduit dans C# 7.0 est une syntaxe qui permet non seulement de tester pour si une variable est d&#8217;un certain type mais également pour en extraire la valeur.</p>
<p>Avant C# 7.0 nous aurions écrit :</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">object</span> <span class="pl-en">o</span> = <span class="pl-c1">1</span>;
<span class="pl-k">if</span> (<span class="pl-en">o</span> is int)
{
    <span class="pl-k">var</span> <span class="pl-en">i </span>= (<span class="pl-k">int</span>)o;
    WriteLine(<span class="pl-pds">$"</span><span class="pl-s">o is int = </span>{i}<span class="pl-pds">"</span>);
}</pre>
</div>
<p>Maintenant nous pouvons écrire :</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">object</span> <span class="pl-en">o</span> = <span class="pl-c1">1</span>;
<span class="pl-k">if</span> (<span class="pl-en">o</span> is int i) <span class="pl-en">WriteLine</span>(<span class="pl-pds">$"</span><span class="pl-s">o is int = </span>{i}<span class="pl-pds">"</span>);</pre>
</div>
<p>Le <em>pattern matching</em> fonctionne aussi dans les <em>switch case</em>. Je tiens à vous mentionner que je n&#8217;approuve généralement pas cette pratique. Il est habituellement déconseiller de faire un <em>switch case</em> sur un type. Je vous présente cette fonctionnalité mais, S.V.P. n&#8217;allez pas mettre des <em>switch case</em> partout et surtout pas sur des types. Il y plus souvent qu&#8217;autrement de meilleures façon de régler ce genre de problème.</p>
<p>Donc voici un exemple d&#8217;utilisation :</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">switch</span> (<span class="pl-en">shape</span>)
{
    <span class="pl-k">case</span> Circle c:
        WriteLine(<span class="pl-pds">$"</span><span class="pl-s">circle with radius </span>{c.Radius}<span class="pl-s">, Area: </span>{c.Area()}<span class="pl-pds">"</span>);
        <span class="pl-k">break</span>;
    <span class="pl-k">case</span> Rectangle r <span class="pl-k">when</span> (r.Length == r.Height):
        WriteLine(<span class="pl-pds">$"</span>{r.Length}<span class="pl-s"> x </span>{r.Height}<span class="pl-s"> square, Area: </span>{r.Area()}<span class="pl-pds">"</span>);
        <span class="pl-k">break</span>;
    <span class="pl-k">case</span> Rectangle r:
        WriteLine(<span class="pl-pds">$"</span>{r.Length}<span class="pl-s"> x </span>{r.Height}<span class="pl-s"> rectangle, Area: </span>{r.Area()}<span class="pl-pds">"</span>);
        <span class="pl-k">break</span>;
    <span class="pl-k">default</span>:
        WriteLine(<span class="pl-s"><span class="pl-pds">"</span>&lt;unknown shape&gt;<span class="pl-pds">"</span></span>);
        <span class="pl-k">break</span>;
    <span class="pl-k">case</span> <span class="pl-c1">null</span>:
        <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-en">ArgumentNullException</span>(<span class="pl-k">nameof</span>(<span class="pl-en">shape</span>));
}</pre>
</div>
<p>Choses importantes à remarquer :</p>
<ol>
<li>il est possible d&#8217;ajouter une clause <em>when</em> pour raffiner encore plus le matching en fonction de propriété de l&#8217;objet.</li>
<li>l&#8217;ordre des clause a de l&#8217;importance. Elle seront évaluées dans l&#8217;ordre du code.</li>
<li>La clause <em>default</em> sera toujours évaluée en dernier peu import son emplacement.</li>
<li>Le <em>case null</em> peut être utiliser pour attribuer un traitement spécial si le case est <em>null</em>. S&#8217;il n&#8217;est pas gérer, il sera traité par la clause <em>default</em>.</li>
<li>Tou comme pour les conditions, les déclaration de variables définies dans les <em>case</em> auront une portée limité à celui-ci. C&#8217;est pourquoi dans l&#8217;exemple, les deux variable <em>r</em> n&#8217;entrent pas en conflit.</li>
</ol>
<h2><a id="user-content-les-tuples" class="anchor" href="https://github.com/BracketShow/CSharp7#les-tuples"></a>Les <em>Tuples</em></h2>
<p>La classe <code>System.Tuple&lt;...&gt;</code> existe déjà depuis un bon moment dans le Framework mais son utilisation n&#8217;est pas très explicite. L&#8217;objet contient des propriétés typées, naturellement, mais pas nommées. Pour accéder aux valeur il faut utiliser les propriétés <em>Item1</em>, <em>Item2</em>, &#8230;</p>
<p>La solution à ce problème est généralement réglé en créant une classe pour contenir les propriété en question. Par exemple :</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">class</span> <span class="pl-en">ActionResult</span>
{
    <span class="pl-k">public </span><span class="pl-k">bool</span> <span class="pl-en">IsFailed</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; }
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">Message</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; }
}</pre>
</div>
<p>Cette classe n&#8217;as pas vraiment beaucoup de valeur. À part être utilisée comme conteneur de donnée dans l&#8217;exemple suivant :</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">static</span> <span class="pl-en">ActionResult</span> <span class="pl-en">ProcessOld</span>()
{
    <span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-en">ActionResult</span>()
    {
        IsFailed = <span class="pl-c1">true</span>,
        Message = <span class="pl-s"><span class="pl-pds">"</span>Not Found<span class="pl-pds">"</span></span>
    };
}</pre>
</div>
<p>L&#8217;ajout des <em>Tuples</em> en tant que citoyen de premier ordre dans C# 7.0 permet de simplifier le code tout en restant explicite tant au niveau du type de données que du nom. Nous pouvons maintenant écrire :</p>
<div class="highlight highlight-source-cs">
<pre>static (<span class="pl-k">bool </span>IsFailed, <span class="pl-k">string </span>Message) ProcesNew()
{
    <span class="pl-k">return</span> (<span class="pl-c1">true</span>, <span class="pl-s"><span class="pl-pds">"</span>Not Found<span class="pl-pds">"</span></span>);
}</pre>
</div>
<p>Cette méthode déclare plusieurs valeur de retour typées et nommées. Il y a plusieurs façon d&#8217;appeler cette méthode pour en recevoir le contenu.</p>
<p>Un première méthode est de déclarer une variable implicitement typée. Comme cette technique crée un <code>System.Tuple</code> il est possible d&#8217;utiliser les propriétés <em>Item1</em> et <em>Item2</em> mais C# 7.0 permet également d&#8217;utiliser les propriétés <em>IsFailed</em> et <em>Message</em>.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">var</span> <span class="pl-en">newResult </span>= ProcesNew();
<span class="pl-k">if</span> (<span class="pl-en">newResult.Item1</span>) <span class="pl-en">WriteLine</span>(newResult.Item2); <span class="pl-c">// tuple standard</span>
<span class="pl-k">if</span> (<span class="pl-en">newResult.IsFailed</span>) <span class="pl-en">WriteLine</span>(newResult.Message); <span class="pl-c">// named properties</span></pre>
</div>
<p>Il est également possible de créer une déclaration explicit des types de retour. Cette méthode a l&#8217;inconvénient de ne plus permettre d&#8217;utiliser les noms de propriété définis par la méthode. Seul les propriétés <em>Item1</em> et <em>Item2</em> sont disponibles.</p>
<div class="highlight highlight-source-cs">
<pre>(<span class="pl-k">bool</span>, string) explicitResult = <span class="pl-en">ProcesNew</span>();
<span class="pl-k">if</span> (<span class="pl-en">explicitResult.Item1</span>) <span class="pl-en">WriteLine</span>(explicitResult.Item2);</pre>
</div>
<p>Par contre, il est possible de créer une déclaration explicit et de renommer les membres du <em>Tuple</em>.</p>
<div class="highlight highlight-source-cs">
<pre>(<span class="pl-k">bool </span><span class="pl-en">HasFailed</span>, string Reason) renamed = <span class="pl-en">ProcesNew</span>();
<span class="pl-k">if</span> (<span class="pl-en">renamed.HasFailed</span>) <span class="pl-en">WriteLine</span>(renamed.Reason);</pre>
</div>
<p>Une autre fonctionnalité permet de faire les choses différemment. En utilisant la déconstruction d&#8217;objet, que nous verrons plus tard, nous pouvons assigner le retour à des variable locale directement.</p>
<div class="highlight highlight-source-cs">
<pre>(<span class="pl-k">bool </span><span class="pl-en">hasFailed</span>, string reason) = <span class="pl-en">ProcesNew</span>();
<span class="pl-k">if</span> (<span class="pl-en">hasFailed</span>) WriteLine(reason);</pre>
</div>
<p>On peut même le faire avec une déclaration implicite si on veut pas avoir à définir les types manuellement.</p>
<div class="highlight highlight-source-cs">
<pre>var (HasFailed, Reason) = ProcesNew();
<span class="pl-k">if</span> (<span class="pl-en">HasFailed</span>) WriteLine(Reason);</pre>
</div>
<p>Comme vous pouvez le constater, les <em>Tuples</em> offrent pleins de possibilités. Pour l&#8217;instant je ne suis pas certains quelle méthode je préfère. Par conséquent, je vous invite à être prudent en utilisant ces nouvelle fonctionnalités. Soyez certains que vous aurez des commentaires de vos collègues de travail qui se demanderons ce que vous essayer de faire avec ça.</p>
<blockquote><p><strong>NOTE:</strong> Pour bénéficier des <em>tuples</em> vou devez ajouter le package NuGet <code>System.ValueTuple</code></p></blockquote>
<h2><a id="user-content-la-déconstruction-dobjets" class="anchor" href="https://github.com/BracketShow/CSharp7#la-déconstruction-dobjets"></a>La déconstruction d&#8217;objets</h2>
<p>La déconstruction d&#8217;objet de C# 7.0 permet de séparer un <em>tuple</em> ou n&#8217;importe quel objet en ses constituants et les assigner à des variables individuelles.</p>
<p>La déconstruction peut prendre la forme d&#8217;une déclaration individuelle des variables:</p>
<div class="highlight highlight-source-cs">
<pre>(<span class="pl-k">string </span><span class="pl-en">firstName</span>, string _, string lastName) = person;
WriteLine(<span class="pl-pds">$"</span>{lastName}<span class="pl-s">, </span>{firstName}<span class="pl-s"> (</span>{_}<span class="pl-s">)</span><span class="pl-pds">"</span>);</pre>
</div>
<blockquote><p>Le caractère &#8220;_&#8221; est utilisé pour ignorer un des constituants de la déconstruction. Il peut aussi être utiliser comme une variable sans pour autant entrer en conflit.</p></blockquote>
<p>L&#8217;utilisation de <em>var</em> peut éviter de nommer les types de retour. Cette déclaration peut être utiliser de deux façon différente. À l&#8217;intérieur de la déclaration:</p>
<div class="highlight highlight-source-cs">
<pre>(<span class="pl-k">var</span> <span class="pl-en">firstName, var _, var lastName) </span>= <span class="pl-en">person</span>;
WriteLine(<span class="pl-pds">$"</span>{lastName}<span class="pl-s">, </span>{firstName}<span class="pl-s"> (</span>{_}<span class="pl-s">)</span><span class="pl-pds">"</span>);</pre>
</div>
<p>ou à l&#8217;extérieur:</p>
<div class="highlight highlight-source-cs">
<pre>var (firstName, _, lastName) = <span class="pl-en">person</span>;
WriteLine(<span class="pl-pds">$"</span>{lastName}<span class="pl-s">, </span>{firstName}<span class="pl-s"> (</span>{_}<span class="pl-s">)</span><span class="pl-pds">"</span>);</pre>
</div>
<p>On peut évidemment aussi assigner lae résultat de la déconstruction à des variable existante:</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">string </span><span class="pl-en">firstName</span>, middleName, lastName;
(<span class="pl-en">firstName</span>, middleName, lastName) = person;
WriteLine(<span class="pl-pds">$"</span>{lastName}<span class="pl-s">, </span>{firstName}<span class="pl-s"> (</span>{_}<span class="pl-s">)</span><span class="pl-pds">"</span>);</pre>
</div>
<p>Tout ça est bien beau mais il faut quand même définir comment faire la déconstruction d&#8217;un objet. Pour ce faire, vous devez ajouter une méthode nommé <em>Desconstructor</em>. Cette méthode ne dois que déclarer des paramètres <em>out</em>.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-en">Person</span>
{
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">FirstName</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; }
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">MiddleName</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; }
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">LastName</span> { <span class="pl-k">get</span>; <span class="pl-k">set</span>; }

    <span class="pl-k">public</span> <span class="pl-en">Person</span>(string firstName, string middleName, string lastName)
    {
        FirstName = firstName;
        MiddleName = middleName;
        LastName = lastName;
    }

    <span class="pl-k">public</span> <span class="pl-k">void</span> <span class="pl-en">Deconstruct</span>(<span class="pl-k">out</span> <span class="pl-k">string</span> <span class="pl-smi">firstName</span>, <span class="pl-k">out</span> <span class="pl-k">string</span> <span class="pl-smi">middleName</span>, <span class="pl-k">out</span> <span class="pl-k">string</span> <span class="pl-smi">lastName</span>)
    {
        firstName = FirstName;
        middleName = MiddleName;
        lastName = LastName;
    }
}</pre>
</div>
<p>Il est commun dans ce cas d&#8217;avoir un symétrie entre la construction et la déconstruction de l&#8217;objet.</p>
<h2><a id="user-content-les-fonctions-locale" class="anchor" href="https://github.com/BracketShow/CSharp7#les-fonctions-locale"></a>Les fonctions locale</h2>
<p>Parfois il serait utile de pouvoir définir une fonction d&#8217;aide pour simplifier le code. Mais avant C# 7.0 la seule option était de définir une fonction privé, qui sera visible d&#8217;ailleurs dans la classe, ou une expression lambda qui peut ne pas être aussi explicit au niveau de la définition.</p>
<p>C# 7.0 permet de créer des fonction locale à même la porté d&#8217;une méthode. Cette fonction a accès aux variable déclaré à l&#8217;intérieur de sa méthode. Par exemple ici nous essayons de faire un simple tri:</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">Sort</span>(<span class="pl-k">int</span>[] <span class="pl-smi">numbers</span>)
{
    <span class="pl-k">for</span>(<span class="pl-k">int</span> <span class="pl-en">i</span> = <span class="pl-c1">0</span>; i &lt; numbers.Length - <span class="pl-c1">1</span>; i++)
    {
        <span class="pl-k">for</span> (<span class="pl-k">int</span> <span class="pl-en">j</span> = i + <span class="pl-c1">1</span>; j &lt; numbers.Length; j++)
        {
            <span class="pl-k">if</span> (numbers[i] &gt; numbers[j])
            {
                <span class="pl-k">var</span> <span class="pl-en">temp </span>= numbers[j];
                numbers[j] = numbers[i];
                numbers[i] = temp;
            }
        }
    }
}</pre>
</div>
<p>Pour éviter d&#8217;ajouter un commentaire pour expliquer ce qu&#8217;on essai de faire à l&#8217;intérieur de la condition nous pouvons créer une fonction locale pour exprimer qu&#8217;il s&#8217;agit d&#8217;un swap.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">Sort</span>(<span class="pl-k">int</span>[] <span class="pl-smi">numbers</span>)
{
    <span class="pl-k">for</span> (<span class="pl-k">int</span> <span class="pl-en">i</span> = <span class="pl-c1">0</span>; i &lt; numbers.Length - <span class="pl-c1">1</span>; i++)
    {
        <span class="pl-k">for</span> (<span class="pl-k">int</span> <span class="pl-en">j</span> = i + <span class="pl-c1">1</span>; j &lt; numbers.Length; j++)
        {
            <span class="pl-k">if</span> (numbers[i] &gt; numbers[j])
            {
                Swap(i, j);
            }
        }
    }

    void Swap(<span class="pl-k">int </span>a, <span class="pl-k">int </span>b)
    {
        <span class="pl-k">var</span> <span class="pl-en">temp </span>= numbers[b];
        numbers[b] = numbers[a];
        numbers[a] = temp;
    }
}</pre>
</div>
<p>Comme la fonction <em>swap</em> est définie au même niveau que le paramètre <em>number</em> de la méthode <em>Sort</em>, elle a accès à son contenu directement sans avoir à le passer en paramètre.</p>
<h2><a id="user-content-de-meilleures-déclarations-de-valeur-littérale" class="anchor" href="https://github.com/BracketShow/CSharp7#de-meilleures-déclarations-de-valeur-littérale"></a>De meilleures déclarations de valeur littérale</h2>
<p>Le caractère &#8220;_&#8221; peut maintenant être utilisé à l&#8217;intérieur de n&#8217;importe quelle expression de valeur numérique pour améliorer la lisibilité nombres plus long.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">var</span> <span class="pl-en">d </span>= 1_234_567;
<span class="pl-k">var</span> <span class="pl-en">x </span>= 0xAA_BB_CC_DD_EE_FF;</pre>
</div>
<p>Il peuvent être littéralement utilisé n&#8217;importe où (sauf au début et à la fin) et n&#8217;ont aucun effet sur la valeur.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">var</span> <span class="pl-en">d1 </span>= 1__________2___3____4;
<span class="pl-k">var</span> <span class="pl-en">d2 </span>= <span class="pl-c1">1234</span>;</pre>
</div>
<p>Ces deux valeurs sont identiques.</p>
<p>C# 7.0 introduit également une nouvelle déclaration littérale pour les nombres binaires.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">var</span> <span class="pl-en">b </span>= 0b1010_1011_1100_1101_1110_1111;</pre>
</div>
<h2><a id="user-content-les-retour-de-fonction-par-référence-ref-returns" class="anchor" href="https://github.com/BracketShow/CSharp7#les-retour-de-fonction-par-référence-ref-returns"></a>Les retour de fonction par référence (Ref returns)</h2>
<p>Vous souvenez-vous de vos cours sur les pointeurs. En C# on a peut oublié que ça existait. On a appris qu&#8217;il y a des type référence et des types valeur et que c&#8217;est ce qui dictait l&#8217;effet d&#8217;un changement sur une valeur de l&#8217;un ou l&#8217;autre de ces types.</p>
<p>Mais il semble que dans certaines situation particulière, les jeux par exemple, qu&#8217;il soit utile pour un fonction de retourner la référence à une valeur. Prenons par exemple le cas d&#8217;une méthode de recherche dans un <em>array</em> qui retourne l&#8217;élément trouvé par référence.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-en">ref</span> int <span class="pl-en">Find</span>(<span class="pl-k">int</span> <span class="pl-smi">number</span>, <span class="pl-k">int</span>[] <span class="pl-smi">numbers</span>)
{
    <span class="pl-k">for</span> (<span class="pl-k">int</span> <span class="pl-en">i</span> = <span class="pl-c1">0</span>; i &lt; numbers.Length; i++)
    {
        <span class="pl-k">if</span> (numbers[i] == number)
        {
            <span class="pl-k">return</span> ref numbers[i]; <span class="pl-c">// return the storage location, not the value</span>
        }
    }
    <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-en">IndexOutOfRangeException</span>(<span class="pl-pds">$"</span>{<span class="pl-k">nameof</span>(<span class="pl-en">number</span>)}<span class="pl-s"> not found</span><span class="pl-pds">"</span>);
}</pre>
</div>
<p>Si on passe un <em>array</em> a cette fonction on peut trouver l&#8217;élément et changer sa valeur en assignant une nouvelle valeur à l&#8217;élément retourné.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">int</span>[] <span class="pl-en">array</span> = { <span class="pl-c1">1</span>, <span class="pl-c1">15</span>, -<span class="pl-c1">39</span>, <span class="pl-c1">0</span>, <span class="pl-c1">7</span>, <span class="pl-c1">14</span>, -<span class="pl-c1">12</span> };
<span class="pl-en">ref</span> int found = ref <span class="pl-en">Find</span>(<span class="pl-c1">7</span>, array); <span class="pl-c">// aliases 7's place in the array</span>
<span class="pl-en">found</span> = 9; <span class="pl-c">// replaces 7 with 9 in the array</span></pre>
</div>
<p>Après cette opération, la variable <em>array</em> contient les éléments 1, 15, -39, 0, 9, 14, -12. L&#8217;assignation de la valeur 9 à l&#8217;élément trouvé remplace directement la case mémoire de l&#8217;<em>array</em> à la position trouvée.</p>
<h2><a id="user-content-les-corps-de-membre-sous-forme-dexpression" class="anchor" href="https://github.com/BracketShow/CSharp7#les-corps-de-membre-sous-forme-dexpression"></a>Les corps de membre sous forme d&#8217;expression</h2>
<p>C# 6.0 a introduit le concept de corp de membre sous forme d&#8217;expression pour les méthode et les propriété. Ce fut un succès Microsoft a décidé d&#8217;ajouter la possibilité d&#8217;utiliser ce concept ailleurs. Nous pouvons maintenant le faire pour les accesseurs, les constructeurs et les finaliseurs.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">class</span> <span class="pl-en">Person</span>
{
    <span class="pl-k">private static </span><span class="pl-en">ConcurrentDictionary</span>&lt;<span class="pl-k">int</span>, <span class="pl-k">string</span>&gt; <span class="pl-en">names</span> = <span class="pl-k">new</span> <span class="pl-en">ConcurrentDictionary</span>&lt;<span class="pl-k">int</span>, <span class="pl-k">string</span>&gt;();
    <span class="pl-k">private </span><span class="pl-k">int</span> <span class="pl-en">id</span> = names.Count;

    <span class="pl-k">public </span><span class="pl-en">Person</span>(<span class="pl-k">string </span><span class="pl-en">name</span>) =&gt; <span class="pl-en">names.TryAdd</span>(<span class="pl-en">id</span>, <span class="pl-en">name</span>); // <span class="pl-en">constructors</span>
    ~<span class="pl-en">Person</span>() =&gt; <span class="pl-en">names.TryRemove</span>(<span class="pl-en">id</span>, <span class="pl-en">out</span> _);              // <span class="pl-en">destructors</span>
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">Name</span>
    {
        <span class="pl-k">get</span> =&gt; names[id];                                 <span class="pl-c">// getters</span>
        <span class="pl-k">set</span> =&gt; names[id] = <span class="pl-k">value</span>;                         <span class="pl-c">// setters</span>
    }
}</pre>
</div>
<h2><a id="user-content-lexpression-throw" class="anchor" href="https://github.com/BracketShow/CSharp7#lexpression-throw"></a>L&#8217;expression <em>throw</em></h2>
<p>Traditionnellement le mot clé <em>throw</em> a toujours été traité comme un <em>statement</em>. Il est maintenant possible avec C# 7.0 de l&#8217;utiliser comme une expression.</p>
<div class="highlight highlight-source-cs">
<pre><span class="pl-k">class</span> <span class="pl-en">Person</span>
{
    <span class="pl-k">public </span><span class="pl-k">string</span> <span class="pl-en">Name</span> { <span class="pl-k">get</span>; }
    <span class="pl-k">public</span> <span class="pl-en">Person</span>(string name) =&gt; Name = name ?? <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-en">ArgumentNullException</span>(<span class="pl-k">nameof</span>(<span class="pl-en">name</span>));
    <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-en">GetFirstName</span>() =&gt; <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-en">NotImplementedException</span>();
    <span class="pl-k">public</span> <span class="pl-k">string</span> <span class="pl-en">GetLastName</span>()
    {
        <span class="pl-k">var</span> <span class="pl-en">parts </span>= Name.Split(<span class="pl-s"><span class="pl-pds">'</span> <span class="pl-pds">'</span></span>);
        <span class="pl-k">return</span> (parts.Length &gt; <span class="pl-c1">1</span>) ? parts[<span class="pl-c1">1</span>] : <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-en">InvalidOperationException</span>(<span class="pl-s"><span class="pl-pds">"</span>No space!<span class="pl-pds">"</span></span>);
    }
}</pre>
</div>
<h2><a id="user-content-conclusion" class="anchor" href="https://github.com/BracketShow/CSharp7#conclusion"></a>Conclusion</h2>
<p>C# 7.0 ajoute beaucoup de nouvelles fonctionnalités. Certaines sont bénéfique et d&#8217;autre sont pour le moins dangereuse. Je vous invite à explorer ces nouvelles fonctionnalités avec précaution. Elle peuvent vous faire économiser quelque ligne de code mais elle peuvent aussi vous faire appliquer de mauvaise pratique de programmation.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.decarufel.net/2017/03/21/quoi-de-neuf-dans-c-7-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bracket Show &#8211; Episode 9 &#8211; Singleton pattern</title>
		<link>https://blog.decarufel.net/2017/03/13/bracket-show-episode-9-singleton-pattern/</link>
		<comments>https://blog.decarufel.net/2017/03/13/bracket-show-episode-9-singleton-pattern/#respond</comments>
		<pubDate>Mon, 13 Mar 2017 11:00:51 +0000</pubDate>
		<dc:creator><![CDATA[Eric De C#]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.decarufel.net/?p=1307</guid>
		<description><![CDATA[Dans cet épisode, nous parlons du patron de conception le singleton. Bien qu&#8217;il existe plusieurs façon de l&#8217;implémenter, .NET nous offre une façon facile et sécuritaire de le faire. Visitez ...]]></description>
				<content:encoded><![CDATA[<p><iframe width="800" height="450" src="https://www.youtube.com/embed/MtJ2TnZ-WPY?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Dans cet épisode, nous parlons du patron de conception le singleton. Bien qu&#8217;il existe plusieurs façon de l&#8217;implémenter, .NET nous offre une façon facile et sécuritaire de le faire.</p>
<p>Visitez le<a href="http://bracketshow.com"> http://bracketshow.com</a></p>
<p><a href="https://github.com/BracketShow/SingletonPattern">https://github.com/BracketShow/SingletonPattern</a></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.decarufel.net/2017/03/13/bracket-show-episode-9-singleton-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bracket Show &#8211; Episode 8 &#8211; Composite pattern</title>
		<link>https://blog.decarufel.net/2017/02/27/bracket-show-episode-8-composite-pattern/</link>
		<comments>https://blog.decarufel.net/2017/02/27/bracket-show-episode-8-composite-pattern/#respond</comments>
		<pubDate>Mon, 27 Feb 2017 12:41:19 +0000</pubDate>
		<dc:creator><![CDATA[Eric De C#]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.decarufel.net/?p=1296</guid>
		<description><![CDATA[Dans cet épisode nous verrons ce qu&#8217;est le patron de conception &#8220;composite&#8221; et comment s&#8217;en servir avec quelques exemples de code utilisable dans une vraie application. Visitez le http://bracketshow.com https://github.com/BracketShow/CompositePatternDemo ...]]></description>
				<content:encoded><![CDATA[<p><iframe width="800" height="450" src="https://www.youtube.com/embed/25nonh-W5po?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Dans cet épisode nous verrons ce qu&#8217;est le patron de conception &#8220;composite&#8221; et comment s&#8217;en servir avec quelques exemples de code utilisable dans une vraie application.</p>
<p>Visitez le <a href="http://bracketshow.com" target="_blank">http://bracketshow.com</a></p>
<p><a href="https://github.com/BracketShow/CompositePatternDemo" target="_blank">https://github.com/BracketShow/CompositePatternDemo</a><br />
<a href="https://en.wikipedia.org/wiki/Composite_pattern" target="_blank">https://en.wikipedia.org/wiki/Composite_pattern</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.decarufel.net/2017/02/27/bracket-show-episode-8-composite-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bracket Show &#8211; Episode 7 &#8211; Protractor</title>
		<link>https://blog.decarufel.net/2017/02/13/bracket-show-episode-7-protractor/</link>
		<comments>https://blog.decarufel.net/2017/02/13/bracket-show-episode-7-protractor/#respond</comments>
		<pubDate>Mon, 13 Feb 2017 06:00:06 +0000</pubDate>
		<dc:creator><![CDATA[Eric De C#]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogdecarufel.azurewebsites.net/?p=1280</guid>
		<description><![CDATA[Hugo Doyon (https://www.linkedin.com/in/hugodoyon/) nous parle de Protractor, un framework pour écrire vos test web automatisés, et de SauceLabs, un service en ligne pour exécuter vos tests sur plus de 800 ...]]></description>
				<content:encoded><![CDATA[<p><iframe width="800" height="450" src="https://www.youtube.com/embed/n4FeEybzixw?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Hugo Doyon (<a href="https://www.linkedin.com/in/hugodoyon/">https://www.linkedin.com/in/hugodoyon/</a>) nous parle de Protractor, un framework pour écrire vos test web automatisés, et de SauceLabs, un service en ligne pour exécuter vos tests sur plus de 800 combinaision de navigateur, OS et résolution.</p>
<p>Visitez le <a href="http://bracketshow.com">http://bracketshow.com</a></p>
<p>Liens mentionnés dans cet épisode:<br />
<a href="http://www.protractortest.org">http://www.protractortest.org</a><br />
<a href="https://saucelabs.com/">https://saucelabs.com/</a><br />
<a href="https://jasmine.github.io/">https://jasmine.github.io/</a><br />
<a href="http://www.seleniumhq.org/">http://www.seleniumhq.org/</a><br />
<a href="https://jenkins.io/">https://jenkins.io/</a><br />
<a href="https://www.jetbrains.com/teamcity/">https://www.jetbrains.com/teamcity/</a><br />
<a href="https://www.browserstack.com/">https://www.browserstack.com/</a><br />
<a href="https://github.com/HugoDoyon/Angular2-Protractor4-End2EndTesting-Examples">https://github.com/HugoDoyon/Angular2-Protractor4-End2EndTesting-Examples</a><br />
<a href="https://github.com/johnpapa/lite-server">https://github.com/johnpapa/lite-server</a></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.decarufel.net/2017/02/13/bracket-show-episode-7-protractor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
