Faut-il créer sa variable dans la boucle, ou en dehors ?

icon Tags de l'article :

Mars 24, 2014
Il s'agit d'une question qu'on a tous, je pense, entendu au moins une fois. Il existe trois types de réponses :

  • Il faut créer ta variable dans ton for, comme ceci :

for(int i = 0 ; i < maListe.Count ; i++) 
{
	int monI = maListe[i];
}

  • Pas du tout, il faut la créer avant :

int monI;
for(int i = 0 ; i < maListe.Count ; i++) 
{
	monI = maListe[i];
}

  • Et la bonne réponse : ça ne change rien.

Il faut savoir que les "variables" éphémères (monI dans ce cas) n'existent que pour le développeur.

En effet, le compilateur est capable d'identifier les variables qui ont une utilisation très spécifique, dans un scope réduit. Il remplacera alors l'utilisation de la variable par un accès direct à cette dernière.

Sur notre exemple :

for(int i = 0 ; i < maListe.Count ; i++) 
{
	int monI = maListe[i];
}

// génèrera strictement le même code MSIL que :

int monI;
for(int i = 0 ; i < maListe.Count ; i++) 
{
	monI = maListe[i];
}
// je n'utilise plus monI à partir d'ici

L'endroit où nous créerons notre variable monI n'a donc aucun impact sur le code MSIL généré.

Néanmoins, il est plutôt conseillé de la créer à l'intérieur du for, et ce pour plusieurs raisons :
  • L'optimiseur comprendra directement que la variable ne sera utilisée que dans la boucle et pas en dehors,
  • On ne transportera pas, à chaque itération, la valeur précédente,
  • On ne risque pas, par inadvertance, de la réutiliser en dehors de la boucle.

Mais il s'agit plus d'une bonne pratique que d'une optimisation.

Bonne soirée et bon dev à tous !

Méthodes d'extensions C# - 2

icon Tags de l'article :

Mars 24, 2014
Bonjour à tous !

Prêts pour une nouvelle fournée de méthodes d'extensions C# super-méga-ultra utiles ?

C'est parti !

Déjà, une méthode d'extension pour la classe string afin de faire bien plus rapidement nos String.Format (et non pas string.Format) :

public static string Format(this string s, params object[] args)
{
    return String.Format(s, args);
}

// et son appel

string myString = "{0} {1}";
myString.Format("Hello", "World");

Ensuite, une autre petite méthode qui va nous servir de raccourci : créer notre propre méthode d'extension Log sur la classe Exception pour unifier le logging de nos erreurs :

public static void Log(this Exception obj)
{
    // votre logique de logging ici
}

// et son utilisation

try
{
    // votre code
}
catch(Exception ex)
{
    ex.Log();
}

Ces deux petites méthodes vous feront gagner un temps fou, croyez-moi ;)

Bon dev à tous !

Méthodes d'extensions C# - 1

icon Tags de l'article :

Mars 21, 2014
Hello à tous,

J'ai décidé de commencer une petite série d'articles sur les méthodes d'extensions vraiment utiles.

A force de développer en C# sur différents projets, je me suis rendu compte que je m'étais constitué un joli petit pool de méthodes d'extensions... que je vais partager avec vous. Merci qui ? :)

Pour commencer, voici une méthode d'extension qui sert à faire un .Contains() case-insensitive sur une collection. Ca peut sembler simple et idiot, mais le faire à la main plusieurs fois est encore plus embêtant :

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    return source.IndexOf(toCheck, comp) >= 0;
}

// et son appel

bool contains = myString.Contains("hello", StringComparison.OrdinalIgnoreCase);

Et pour continuer sur cette lancée, voici une petite méthode d'extension pour vérifier si notre objet est présent dans une liste d'objets passés en paramètres, bien plus utile que ça en a l'air :

public static bool IsIn<T>(this T source, params T[] list)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return list.Contains(source);
}

// et son appel

if (myString.IsIn("string1", "string2", "string3", "string4"))
{
    // do something
}

Bon weekend et bon dev à tous !

DateTime.Now ou DateTime.UtcNow

icon Tags de l'article :

Mars 20, 2014
Et vous, comment vous faites avec les dates ? - Doc Emmet Brown, ou pas.

Aujourd'hui on utilise tous les dates dans nos applications : récupération de la date courante, stockage d'une date précise, calculs sur des dates, etc.

Sauf qu'il existe deux façons de récupérer et de manipuler la date courante :

DateTime.Now
// ou
DateTime.UtcNow

Maintenant la question : laquelle utiliser ?

La réponse est simple : DateTime.UtcNow.

Pourquoi ?

Déjà DateTime.UtcNow est bien plus performant que DateTime.Now (du fait de ne pas avoir à gérer le fuseau horaires et les changements d'heure).

Ensuite, stocker des dates au format UTC permet d'éviter les nombreux problèmes d'incohérences sur les dates. En effet, utiliser DateTime.Now vous posera problème dès que vous hébergerez votre application dans un autre fuseau horaire (merci le Cloud !), dès que vous migrerez vos données, dès que vous effectuerez des calculs sur les dates, ...

Après vous pouvez toujours convertir la date pour l'afficher ou la manipuler, mais pour le stockage et à la récupération, il faut privilégier DateTime.UtcNow.

Vous ne direz pas qu'on ne vous a pas prévenu !

EDIT : Attention, il existe une exception : la réutilisation de dates. Lorsqu'on veut stocker une donnée au format date la réutiliser (par exemple planifier un rendez-vous récurrent tous les vendredis à 9h00), il ne faut pas la stocker au format UTC. Pourquoi ? Si on la stocke au format UTC et qu'on la convertie à chaque fois, le jour où on changera d'heure... Notre rendez-vous aussi changera d'heure ! Dans ce genre de situations (assez rares, il faut bien l'admettre), la solution est d'utiliser le DateTimeOffset.

string ou String ?

icon Tags de l'article :

Mars 20, 2014
Savez vous quelle est la différence entre string et String ? Et bien... Il n'y en a pas. Enfin...

Il faut savoir que string n'est qu'un alias de System.String.

Techniquement, il n'y a donc aucune différence. C'est la même chose pour int et Int32 par exemple.

Après, lorsqu'on code, il y a quelques bonnes pratiques conseillées vis-à-vis de l'utilisation de string & String.

Il est généralement conseillé d'utiliser string lorsqu'on se réfère à une instance de string :

string myString = "Hello World!";

Mais il est plutôt conseillé d'utiliser String lorsqu'on se réfère à la classe, par exemple pour appeler ses méthodes statiques :

string myString = String.Format("{0} {1}!", "Hello", "World");

Voilà, c'était le petit conseil C# du jour.

Bonne journée et bon dev à tous !

Voir le type d'une variable initialisée avec var

icon Tags de l'article :

Mars 19, 2014
"I've been so wrong these years!" - moi

J'ai découvert quelque chose il y a quelques jours... Quelque chose qui a changé ma vie de développeur .Net...

Quelque chose que la majorité des gens connaissent depuis longtemps et que j'aurais dû connaître depuis longtemps également...

J'ai découvert qu'on pouvait savoir le type d'une variable initialisée avec var en passant la souris sur le var.

Pas besoin d'aller regarder ce qu'il y a à droite du =, il suffit juste de passer la souris sur le "var" et le type de notre variable apparait sous nos yeux ébahis :



J'en ai les larme aux yeux...
Dire que je viens de découvrir ça après 5 ans de .Net...

Voir une requête générée par Linq To SQL

icon Tags de l'article : , ,

Mars 19, 2014
Une question qui revient assez souvent lorsqu'on travaille avec Linq To Sql : comment peut-on faire pour voir une requête SQL générée ?

Certains vous recommenderont d'utiliser Linqpad, ce qui est effectivement une solution...

Mais il y a bien plus simple : utiliser la méthode .ToString() sur notre objet IQueryable.
Cette méthode (qui surcharge en fait ObjectQuery.ToTraceString()) renverra tout simplement la requête SQL générée par Linq To Sql !

Exemple :

using (var dc = new DataClassesVideoGameDataContext())
{
    var result = dc.VideoGames.Where(e => e.Price < 70).OrderBy(e => e.Name);

    var query = result.ToString();

    // query : 
    // SELECT [t0].[IdVideoGame], [t0].[Name], [t0].[Description], [t0].[Price]
    // FROM [dbo].[VideoGame] AS [t0]
    // WHERE [t0].[Price] < @p0
    // ORDER BY [t0].[Name]
}

Bon dev à tous !

Un blogueur renaît...

icon Tags de l'article :

Mars 18, 2014
Comme vous l'avez probablement déjà lu, j'ai décidé de séparer mon blog en deux...

Vous ne retrouverez donc, ici, que les articles ultra techniques sur le développement : morceaux de code, astuces, guides, architecture, tutoriels, etc.

L'intérêt de ce blog pour moi est de pouvoir publier des articles très régulièrement sans gêner les gens qui suivaient mon blog sans s'intéresser au développement.

Voilà, bonne visite à tous !

Les raccourcis clavier incontournables de Visual Studio

icon Tags de l'article :

Mars 03, 2014
Logo Visual Studio

Comme je me suis dit que ça pourrait vous intéresser... Du moins certains d'entre vous :

Voici la liste de tous les raccourcis Visual Studio que j'utilise presque tous les jours.

A apprendre par coeur quand vous passez du temps sur Visual Studio :

F12 : accéder à la référence
SHIFT + F12 : trouver toutes les références
F5 : lancer le DEBUG
CTRL + F5 : lancer l'application sans DEBUG
F6 : lancer le build
CTRL + PAUSE : arrêter l'opération en cours (build, déploiement, etc.)
SHIFT + F5 : arrêter le débug

CTRL + ; : faire apparaître le menu des types pour ensuite ajouter automatiquement un using (en faisant entrée)
CTRL + SHIFT + F : rechercher dans tous les fichiers
CTRL + , : accéder directement à une classe ou à un fichier en tapant son nom (ou un morceau de son nom)
CTRL + K + D ou CTRL + E + D : réindenter le fichier courant
CTRL + K + C ou CTRL + E + C : commenter la sélection
CTRL + K + U ou CTRL + E + U : décommenter la sélection
CTRL + M + O : plier toutes les méthodes et régions du fichier courant
CTRL + M + L : déplier toutes les méthodes et régions pliées

ALT + SHIFT + flèches ou sélection à la souris : sélectionner un bloc de texte sur plusieurs lignes
ALT + SHIFT + ENTREE : réduire les panels pour mieux voir le fichier courant
CTRL + F3 : recherche le terme sélectionné (F3 pour voir le terme suivant, etc.)
CTRL + SHIFT + V : remonter dans l'historique du presse-papier
CTRL + D + Q : espion express

En débug :

F10 : avancer d'un cran (on ne rentre pas dans un éventuel sous-traitement)
F11 : avancer d'un cran (on rentre dans un éventuel sous-traitement)
F5 : reprendre le déroulement normal (jusqu'au prochain point d'arrêt)
CTRL + SHIFT + F9 : supprimer tous les points d'arrêt

Bon dev à tous !

Un bon développeur restera un bon développeur, même sur d'autres langages

icon Tags de l'article : ,

Janvier 17, 2014


Ceux qui me connaissent un peu savent que je suis développeur .Net depuis maintenant... 4 ans. Avant cela, je développais beaucoup... en PHP. J’adorais ce langage. Je l'ai utilisé pendant presque 3 ans sur de nombreux projets : personnels, école, stages, etc.

Puis, j’ai découvert le .Net avec C#, Visual Studio et ASP.Net.
Smooth, efficace, programmer-friendly, le meilleur IDE du moment, des performances à tomber... tout ce qu’il fallait pour que je succombe et que je me plonge dans ce langage à fond.

Sauf que voilà, les projets en ASP.Net n'ont jamais été simples à héberger ni à partager... Et comme je voulais rendre MyCryptoChat utilisable par le plus grand monde, il fallait que je développe une version en PHP, le langage que je n’avais pas utilisé depuis 4 ans...

Et bien vous savez quoi ? Je suis bien meilleur en PHP aujourd’hui que je ne l’étais il y a 4 ans.

En effet, même si la syntaxe du langage change énormément du C#, je suis meilleur à plein de niveaux aujourd’hui :
* POO,
* Architecture,
* Algorithmie et logiques de conception,
* Optimisations et réflexions autour des performances,
* Analyse,
* Debug,
* ...

Au final je n’aurais galéré que deux jours pour porter mon projet ASP.Net MVC en PHP. Deux jours.

Le temps de rentrer dans le langage, de retrouver toutes les méthodes dont j'avais besoin, de faire des tests de performances, de tester, de corriger la majorité des bugs, de redécouvrir les limites du langage...

Deux jours.

Le langage change, mais les compétences restent.

Je ne suis pas un développeur .Net, je suis un développeur tout court.


Je ne connais peut-être pas *tout* le framework ni les méthodes, mais la doc est là pour ça.

Seulement deux jours, et je sais développer en PHP. Combien de jours me faudrait-il avant de commencer à être vraiment à l’aise avec le langage ? Seulement quelques jours de plus probablement...

C’est triste qu’en France nous ne soyons jugés qu’à notre niveau dans un langage. Développeur .Net et vous voulez faire du Java ? Mais vous êtes dingue !

Bref, je m’appelle Tommy et je suis développeur. Et toi, à quoi tu joues ?

Photo Credit: Wikipedia