[Exemple de code] Méthodes partielles (C#3)

by Fabien Lavocat 24. juillet 2008 15:26

Le principe des méthodes partielle est identique aux classes partielles, à savoir séparer les méthodes en 2 parties. La différence avec les classes partielle est que pour les méthodes, nous allons séparer la déclaration de la méthode de son corps. Cela sert surtout pour le travail collaboratif, où bien lorsque vous avez des classes très grandes (si vous trouvez une autre utilité, n’hésitez pas à laisser des commentaires), en effet, vous allez pouvoir mettre dans un fichier toutes les déclarations des méthodes et dans un autre, les corps de ces même méthodes.

Comme pour les classes partielles, nous allons utiliser le mot clé : partial.

Attention ! Il est interdit de mettre un modificateur d’accès aux méthodes partielles, celles-ci sont private par défaut. Il est également obligatoire de déclarer vos méthodes partielles dans une classe ou une structure partielle.

// Fichier Voiture_Declarations.cs
public partial class Voiture
{
    // Déclaration de la méthode Avancer()
    partial void Avancer(Int32 vitesse);
}

 

// Fichier Voiture_Methodes.cs
public partial class Voiture
{
    // Corps de la méthode Avancer()
    partial void Avancer(Int32 vitesse)
    {
        Console.WriteLine("La voiture avance à {0} km/h", vitesse);
    }
}

Tags: ,

Exemples de code

Exemple de code : Calculer la taille totale d'un répertoire (C#)

by Fabien Lavocat 20. juin 2008 09:07
Nous allons voir comment avec deux petites fonctions, calculer la taille totale d’un répertoire et afficher sa taille en Mo.

Commencez déjà par importer le namespace System.IO :

using System.IO;

Ensuite nous allons créer une fonction récurcive afin de pouvoir pouvoir entrer dans les sous-répertoires.

   1: private Int64 DirectoryLength(DirectoryInfo folder)
   2: {
   3:     Int64 bytes = 0;
   4:     foreach (FileInfo fi in folder.GetFiles())
   5:         bytes += fi.Length;
   6:  
   7:     foreach (DirectoryInfo i in folder.GetDirectories())
   8:         bytes += DirectoryLength(i);
   9:  
  10:     return bytes;
  11: }

Cette fonction prend en paramètre un objet de type "DirectoryInfo” qui représente le dossier à analyser. Elle parcourt la liste des fichiers présents dans ce dossier et récupére leur taille. Ensuite on cherche s’il y a des sous-répertoires présents, si c’est le cas, on appelle la même fonction avec  le répertoire courant.

L’appel de la fonction :

   1: private void Form1_Load(object sender, EventArgs e)
   2: {
   3:     // Le @ permet d'échapper tous les caractères spéciaux
   4:     String folder = @"C:\DossierATester\";
   5:  
   6:     // Si le dossier n'existe pas on arrête de traitement
   7:     if (!Directory.Exists(folder))
   8:         return;
   9:  
  10:     // Le dossier existe, on peut calculer sa taille
  11:     Int64 size = DirectoryLength(new DirectoryInfo(folder));
  12:  
  13:     // Ensuite on l'affiche
  14:     Console.WriteLine("Taille du dossier '{0}' : {1} Mo", folder, size.ToMo());
  15: }

Mais qu’est ce que "size.ToMo()” ?

Une méthode d’extention :

   1: public static class Functions
   2: {
   3:     public static String ToMo(this Int64 input)
   4:     {
   5:         // N02 permet d'afficher au format : 1 234.56
   6:         return (input / (1024 * 1024)).ToString("N02");
   7:     }
   8: }

Petite information, si je n’ai utilisé que des Int64 c’est que la méthode Lenght() retourne un objet de type long et vous le savez, long est un alias de Int64 (comme string qui est un alias de String), et que je n’aime pas trop, pour la visibilité du code, travailler avec des alias.

Maintenant un petit quiz !!!

Int32 est une classe. Vrai ou Faux ?

Tags:

Exemples de code

Exemple de code : Comment créer un contrôle dynamiquement (C#)

by Fabien Lavocat 17. avril 2008 07:56

Cet exemple de code vous montrera par un exemple, comment créer un contrôle dynamiquement, l’insérer sur un formulaire et s’abonner à ses événements.

Placez le code suivant dans un corps de méthode où vous souhaitez que le contrôle soit créé, par exemple le Form_Load.

Prenons le cas d’un bouton, la première étape consiste à créer l’objet et affecter des valeurs à ses propriétés :

// Création du bouton
System.Windows.Forms.Button button = new Button();
button.Text = "Click me!";
button.Location = new Point(25, 25); // Définition de la position du bouton

La seconde étape, s’abonner à un événement. Pour cela, il faut créer la méthode qui sera appelée lors du déclenchement de cet événement :

private void button_Click(object sender, EventArgs e)
{
   MessageBox.Show(“button_Click”);
}

Ensuite le code pour s’abonner à l’événement :

// Abonnement à l’événement "Click"
button.Click += new EventHandler(button_Click);

Enfin, ajouter le contrôle sur le formulaire, rien de plus simple :

// Ajout du contrôle sur le formulaire
this.Controls.Add(button);

Petite astuce :

Lorsque vous commencez à écrire : « button.Click += », l’Intelisense vous proposera automatiquement de créer la méthode (ici button_Click) et l’abonnement à cette méthode.

Mots clés Technorati :

Tags:

Exemples de code

Exemple de code : Requêtes paramétrées (C#, SQL)

by Fabien Lavocat 31. mars 2008 17:25

net.jpgDans cet exemple, nous allons voir comment écrire des requêtes paramètrées. Déjà, pourquoi écrire des requêtes paramètrées ? Et bien d’une part pour ne pas se tromper dans l’écriture de la requête, qui n’a jamais oublié des ‘ dans ses applications ? Ensuite il se pose un problème de sécurité, en effet il peut se produire des failles de SQL Injection.

Prennons une table classique d’utilisateurs :

db.JPG

Une simple table avec trois colonnes : Un identifiant, un nom et un prénom.

   1: // Variables quelconques
   2: String lastname = "Lavocat";
   3: String firstname = "Fabien"; 
   4:  
   5: // Chaîne de connexion à la base de données
   6: String cnxStr = System.Configuration.ConfigurationManager.ConnectionStrings[”cnx”].ConnectionString;
   7: // Requête SQL
   8: String sql = "INSERT INTO Users (user_lastname, user_firstname) VALUES ('" + lastname + "', '" + firstname + "')"; 
   9:  
  10: using (System.Data.SqlClient.SqlConnection cnx = new System.Data.SqlClient.SqlConnection(cnxStr))
  11: using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cnx))
  12: {
  13:     try
  14:     {
  15:         // Ouverture de la connexion
  16:         cnx.Open(); 
  17:         
  18:         // Exécution de la requête sur la base de données
  19:         cmd.ExecuteNonQuery();
  20:     }
  21:     catch (Exception e)
  22:     {
  23:         Console.WriteLine("Erreur : " + e.Message);
  24:     }
  25:     finally
  26:     {
  27:         // Fermeture de la connexion
  28:         if (cnx.State == System.Data.ConnectionState.Open)
  29:             cnx.Close();
  30:     }
  31: } 

Et maintenant en ajoutant des paramètres :

   1: // Variables quelconques
   2: String lastname = "Lavocat";
   3: String firstname = "Fabien"; 
   4:  
   5: // Chaîne de connexion à la base de données
   6: String cnxStr = System.Configuration.ConfigurationManager.ConnectionStrings[”cnx”].ConnectionString;
   7: // Requête SQL avec paramètres
   8: String sql = "INSERT INTO Users (user_lastname, user_firstname) VALUES (@lastname, @firstname)"; 
   9:  
  10: using (System.Data.SqlClient.SqlConnection cnx = new System.Data.SqlClient.SqlConnection(cnxStr))
  11: using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cnx))
  12: {
  13:     try
  14:     {
  15:         // Ajout des paramètres
  16:         cmd.Parameters.AddWithValue("lastname", lastname);
  17:         cmd.Parameters.AddWithValue("firstname", firstname);   // Ouverture de la connexion
  18:         cnx.Open();  // Exécution de la requête sur la base de données
  19:         cmd.ExecuteNonQuery();
  20:         }
  21:     catch (Exception e)
  22:     {
  23:         Console.WriteLine("Erreur : " + e.Message);
  24:     }
  25:     finally
  26:     {
  27:         // Fermeture de la connexion
  28:         if (cnx.State == System.Data.ConnectionState.Open)
  29:             cnx.Close();
  30:     }
  31: }

Vous remarquez la modification de la requête SQL. En effet j’ai rajouté deux paramètres qui sont des “variables” précédées d’un @.

   1: cmd.Parameters.AddWithValue("lastname", lastname);
   2: cmd.Parameters.AddWithValue("firstname", firstname); 

Ces deux lignes permettent d’affecter à ces paramètres des valeurs.
Note : Le caractère "@" n’est pas obligatoire ici.

Mots clés Technorati : ,,

Tags: ,

Exemples de code

Exemple de code : Constructeur de classe (C# 3.5)

by Fabien Lavocat 24. mars 2008 09:57

net.jpgPrenons une classe quelconque avec une propriété :

public class MyClass
{
   public String MyProperty { get; set; }
}

Nous allons maintenant voir une nouvelle façon de créer une instance de cette classe en définissant une valeur pour la propriété MyProperty.

MyClass variableA = new MyClass() { MyProperty = "Bonjour" };
MyClass variableB = new MyClass();
variableB.MyProperty = "Bonjour";

Vous remarquez le premier appel du constructeur avec l’assignation de la valeur à la propriété MyProperty est entre accolades.
Quelle est la différence entre ces deux méthodes ? Voyons ce que nous propose Reflector :

MyClass <>g__initLocal0 = new MyClass();
<>g__initLocal0.MyProperty = "Bonjour”;
MyClass variableA = <>g__initLocal0;
MyClass variableB = new MyClass();
variableB.MyProperty = "Bonjour";

Avec ce code, nous pouvons comprendre le mécanisme de création de la variable A. La CLR commence par créer une instance de la classe MyClass en temporaire dans la mémoire de l’ordinateur, ensuite elle affecte une valeur à la propriété MyProperty de la variable temporaire puis si aucune erreur n’est déclenchée, la variable variableA reçoit la référence de la variable temporaire.
Dans la seconde méthode, on créé simplement une nouvelle instance de la classe MyClass que l’on affecte à notre variable variableB puis on change la valeur de sa propriété MyProperty.

Mots clés Technorati : ,

Tags: ,

Exemple de code : Propriétés automatiques (C# 3.5)

by Fabien Lavocat 23. mars 2008 11:01

 

clip_image001En C#2.0, comment faisions-nous pour créer des attributs avec leurs propriétés associées ?

private String _myProperty;
 
public String MyProperty 
{ 
    get { return this._myProperty; } 
    set { this._myProperty = value; } 
}

Et voilà ce que le logiciel Reflector traduit à partir du code IL généré à la compilation :

private string _myProperty;
 
public string MyProperty 
{ 
    get 
      { 
        return this._myProperty; 
      } 
    set 
      { 
        this._myProperty = value; 
      } 
}

Vous remarquez que ce sont exactement les même lignes.
Nous allons maintenant utiliser la simplification d’écriture de C#3.5 :

public String MyProperty 
{ 
    get; 
    set; 
}

Il n’est désormais plus nécessaire de créer l’attribut privé ainsi que le contenu des méthodes get et set de la propriété.
Voilà ce que Reflector nous génére à partir du code IL :

public string MyProperty 
{ 
    [CompilerGenerated] 
    get 
      {
        return this.<myproperty>k__backingfield;
      }
    [CompilerGenerated]
    set 
      {
        this.<myproperty>k__BackingField = value;
      }
}

L’attribut [CompilerGenerated] qui est rajouté par le compilateur indique que c’est lui-même (le compilateur) qui as créé le contenu de la méthode. <myproperty>k__backingfield permet à la CLR de récupérer ou modifier la valeur auquel fait référence la propriété étant donné que tout à été généré par le compilateur.

Si vous ne connaissez pas Reflector, je vous conseille de jeter un coup d’oeil sur ce logiciel : http://www.aisto.com/roeder/dotnet/

 

Tags: ,

Exemples de code

Exemple de code : Convertion explicite (C#)

by Fabien Lavocat 22. mars 2008 08:01

net.jpgA la différence de la convertion implicite, la convertion explicite est obligatoire lors qu’il y a un risque de perte de données. On utilise alors le mot clef explicit, ainsi que le type de l’objet cible entre parenthèses. Exemple :

 

Prennons une classe Euro et une classe Dollar afin de faire des conversions :

public class Euro
{
  public Single Value { get; set; }
  public static explicit operator Euro(Dollar value)
  {
    return new Euro() { Value = value.Value * 0.6476f };
  }
}

public class Dollar
{
  public Single Value { get; set; }
  public static explicit operator Dollar(Euro value)
  {
    return new Dollar() { Value = value.Value * 1.5435f };
  }
}

La méthode permettant de faire la convertion explicite doit être marquée static et on utilise les mots clefs explicit et operator :

public static explicit operator Type d’arrivée(Type de départ value)
{
  Traitement de la convertion…
}

Voilà comment faire la convertion explicite :

Euro euro = new Euro() { Value = 15 };
Dollar dollar = (Dollar)euro; // Convertion explicite
Console.WriteLine(euro.Value.ToString() + “€ = $” + dollar.Value.ToString());
// Affiche : 15€ = $23.1525

Lien MSDN : http://msdn2.microsoft.com/fr-fr/library/xhbhezf4.aspx

Mots clés Technorati : , ,

Tags: ,

Exemples de code

Exemple de code : Convertion implicite (C#)

by Fabien Lavocat 21. mars 2008 06:48

net.jpgOn appelle convertion implicite le fait de convertir un objet d’un certain type en un objet d’un autre type sans préciser le cast. Ce type de convertion doit garantir qu’il n’y ait aucune perte de données.

Ce type de convertion est possible lorsque l’on essaye de convertir un objet d’un type A en un type B si la classe A dérive ou implémente la classe ou l’interface B. Exemple :

public class B
{
}
public class A : B
{
}
A a = new A();
B b = a;

L’autre possibilité est l’utilisation du mot clef implicit lors de la déclaration d’un opérateur de convertion. Exemple :
Ici, nous avons une classe nommée MyString qui contient une chaîne de caractère.
public class MyString
{
  private String _value;
  public MyString(String value)
  {
    this._value = value;
  }

  public static implicit operator MyString(String value)
  {
    return new MyString(value);
  }

  public override String ToString()
  {
    return this._value;
  }
}

La méthode permettant de faire la convertion implicite doit être marquée static et on utilise les mots clefs implicit et operator :

public static implicit operator Type d’arrivée(Type de départ value)
{
  Traitement de la convertion…
}

Voilà comment faire la convertion implicite :

String s = “Bonjour”;
MyString ms = s; // Convertion implicite
Console.WriteLine(ms); // Affiche : Bonjour

Lien MSDN : http://msdn2.microsoft.com/fr-fr/library/z5z9kes2.aspx

Mots clés Technorati : , ,

Tags: ,

Exemple de code : LINQ to XML (C#)

by Fabien Lavocat 20. mars 2008 08:59

linq.jpgLINQ to XML (anciennement XLINQ) est une technologie permettant de manipuler des fichiers XML plus simplement et plus intuitivement qu’en utilisant les techniques de C#2.0 et précédemment.

Commençons par créer le document XML en mémoire par un code C# :

XElement cars = new XElement(“cars”,
  new XElement(“car”,
    new XAttribute(“Immatriculation”, “1234AB33″),
    new XElement(“Marque”, “Aston Martin”),
    new XElement(“Modèle”, “Vantage V8 Coupé”),
    new XElement(“Puissance”, “557cv”),
    new XElement(“Prix”, “110.000,00€”)
  ),
  new XElement(“car”,
    new XAttribute(“Immatriculation”, “5678CD33″),
    new XElement(“Marque”, “Aston Martin”),
    new XElement(“Modèle”, “DB9 V12″),
    new XElement(“Puissance”, “450cv”),
    new XElement(“Prix”, “118.000,00€”)
  ),
  new XElement(“car”,
    new XAttribute(“Immatriculation”, “9012EF33″),
    new XElement(“Marque”, “Ferrari”),
    new XElement(“Modèle”, “F430 Scuderia”),
    new XElement(“Puissance”, “510cv”),
    new XElement(“Prix”, “207.900,00€”)
  ),
  new XElement(“car”,
    new XAttribute(“Immatriculation”, “3456GH33″),
    new XElement(“Marque”, “Ferrari”),
    new XElement(“Modèle”, “360 Modena”),
    new XElement(“Puissance”, “400cv”),
    new XElement(“Prix”, “138.000,00€”)
  )
);

Les classes XDocument, XElement et XAttribute se trouvent dans le namespace : System.Xml.Linq. Utiliser ces classes est quand même plus simple que l’ancienne méthode et plus lisible surtout. Enfin il ne s’agit que de mon point de vue.

Passons maintenant à requête LINQ :

// Récupération de toutes les voitures dont la puissance est supérieure à 500cv
// Vous remarquerez l’utilisation de la méthode d’extention GetPower()

var search = from car in cars.Descendants(“car”) // Tous les éléments “car”
             where car.Element(“Puissance”).Value.GetPower() > 500
             select car.Attribute(“Immatriculation”).Value + ” est une ” +
                    car.Element(“Marque”).Value + ” “ +
                    car.Element(“Modèle”).Value + ” puissance “ +
                    car.Element(“Puissance”).Value + ” prix : “ +
                    car.Element(“Prix”).Value + “€”;

Si vous avez essayé l’exemple de code LINQ to Object, vous ne serez pas dépaysé par l’écriture de la requête. Donc ici je cherche dans tous les éléments “car” dont la puissance est supérieure à 500 cv. Pour cela, j’ai créé une méthode d’extention de la classe String, nommée GetPower. Voilà son implémentation :

public static class ExtendMethods
{
 ///
 /// Méthode d’extention permettant de récupérer la puissance
 /// d’une voiture à partir d’une chaîne de caractère
 ///

 public static Int32 GetPower(this String entry)
 {
  String power = entry.Replace(“cv”, “”);
  Int32 result;
  if (Int32.TryParse(power, out result))
    return result;
  else
    return
0;
 }
}

Cette méthode d’extention, retire “cv” de la chaîne de caractère et fait une convertion en Int32.

Maintenant, on affiche le résultat :

foreach (var item in search)
  Console.WriteLine(item);

Et voilà ce que l’on a dans la console :

1234AB33 est une Aston Martin Vantage V8 Coupé puissance 557cv prix : 110.000,00€
9012EF33 est une Ferrari F430 Scuderia puissance 510cv prix : 207.900,00€
Appuyez sur une touche pour continuer…

Lien MSDN : http://msdn2.microsoft.com/fr-fr/library/bb387098.aspx

Mots clés Technorati : , ,, ,

Tags: , , ,

Exemples de code

Exemple de code : Méthodes d'extension (C#)

by Fabien Lavocat 19. mars 2008 06:42

net.jpgComment fallait-il faire pour créer une méthode bien spécifique à un type de données bien précis ?

Par exemple, nous pouvons créer une méthode dans la classe souhaité et appliquer un traitement à un objet. Ok c’est bien, mais lorsque nous n’avons pas accès au code source de la classe en elle-même me diriez-vous, comme les classes du framework. Nous créons simplement une méthode static qui prend en paramètre une valeur de ce type, qui applique un traitement et retourne le résultat.

Mais comme vous avez déjà vu pas mal d’articles sur les nouveautés du C#3, un simple rappel sur les méthodes d’extension s’impose. En effet, grâce à cette nouveauté, il suffit de créer une méthode static, dans une classe static, qui prendra en paramètre une valeur de ce type, précédé du mot clef this , d’appliquer un traitement et d’en retourner le résultat.
Cette méthode sera disponible depuis n’importe quel point de votre code sur le type dont vous avez écrit la méthode.

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         Int32 i = 5;
   6:         Console.WriteLine(i.Square());
   7:         // ==> 25
   8:         Console.WriteLine((5).Square());
   9:         // ==> 25 
  10:         
  11:         String s = "Hello";
  12:         Console.WriteLine(s.InversChars());
  13:         // ==> olleH
  14:         Console.WriteLine("Hello".InversChars());
  15:         // ==> olleH
  16:     }
  17: } 
  18:  
  19: static class ExtendMethods
  20: {
  21:     public static Int32 Square(this Int32 integer)
  22:     {
  23:         return integer * integer;
  24:     }
  25:  
  26:     public static String InversChars(this String s)
  27:     {
  28:         String tmp = "";
  29:         for (Int32 i = s.Length - 1; i >= 0; i–)
  30:             tmp += s[i];
  31:         return tmp;
  32:     }
  33: } 

Lien MSDN : http://msdn2.microsoft.com/fr-fr/library/bb383977.aspx

Mots clés Technorati : ,,

Tags: ,

Exemples de code

A propos de l'auteur

Fabien Lavocat

Lavocat Fabien
Ingénieur Multimédia - TMM Communication



"Blog-Microsoft.fr is an independent blog and is not affiliated with, nor has it been authorized, sponsored, or otherwise approved by Microsoft Corporation."

Contactez-moi Send mail

MVP
Microsoft Most Valuable Professional
Client Application Development