Overblog
Suivre ce blog Administration + Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles RÉCents

2 février 2014 7 02 /02 /février /2014 01:29

Action<T> et Func<T,TResult>

 

- Action<T> : délégué qui permet de pointer vers une méthode qui ne renvoie rien

- Func<T,TResult> : délégué utilisé avec une méthode renvoyant un résultat (le dernier paramètre correspond au type de retour)

Exemples :

1-Action

       delegate void SendMessage(string message);

 

        private void button1_Click(object sender, EventArgs e)

        {

            SendMessage sendMessage = ShowMessage;

            sendMessage("Bonjour à tous !");

        }

        public void ShowMessage(string message)

        {

            MessageBox.Show(message);

        }

Avec Action<T>

       private void button1_Click(object sender, EventArgs e)

        {

            Action<string> sendMessage = ShowMessage;

            sendMessage("Bonjour à tous !"); 

 

        }

        public void ShowMessage(string message)

        {

            MessageBox.Show(message);

        }

 

Avec méthode anonyme

Action<string> sendMessage = delegate(string message) { MessageBox.Show(message); };

Avec expression Lambda

Action<string> sendMessage = message => { MessageBox.Show(message); };

 

2-Func

delegate string SayHello(string name);

 

        private void button1_Click(object sender, EventArgs e)

        {

            SayHello sayHello = GetMessage;

            string message = sayHello("Marie Bellin");

        }

        public string GetMessage(string name)

        {

            return "Bonjour " + name  + " !";

        }

Avec Func<T,TResult>

private void button1_Click(object sender, EventArgs e)

        {

            Func<string, string> sayHello = GetMessage;

            string message = sayHello("Marie Bellin");

        }

        public string GetMessage(string name)

        {

            return "Bonjour " + name  + " !";

        }

 

Avec méthode anonyme

Func<string, string> sayHello = delegate(string name) { return "Bonjour " + name + " !"; };

Avec expression Lambda

Func<string, string> sayHello =  name => { return "Bonjour " + name + " !"; };

 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:28

I - Nouveautés  de C# 2.0

 

1-Les méthodes anonymes

On passe par l’intermédiaire d’un délégué pour appeler une méthode .Cette méthode peut être : une « vraie méthode », une expression lambda, une méthode anonyme .

Avec un délégué nommé :

- un delegate

- une méthode respectant les paramètres et le type de retour du delegate

- une instance pointant sur la méthode

- déclenchement

 

        delegate bool Authentify(string clientName);

 

        private void btnValidate_Click(object sender, EventArgs e)

        {   

            Authentify authentify = CompareName;

 

            bool result = authentify(txtName.Text);

        }

 

        public bool CompareName(string clientName)

        {

            return clientName == "Bellin";

        }

 

Avec une méthode anonyme

       delegate bool Authentify(string clientName);

 

        private void btnValidate_Click(object sender, EventArgs e)

        {   

            // 2 méthode anonyme

            Authentify authentify = delegate(string clientName) { return clientName == "Bellin"; };

           

            bool result = authentify(txtName.Text);

        }

Avec expression lambda

//

        delegate bool Authentify(string clientName);

 

        private void btnValidate_Click(object sender, EventArgs e)

        {   

            // 3 expression lambda

            Authentify authentify = new Authentify(clientName =>

            {

                { return clientName == "Bellin"; }

 

            });

 

            bool result = authentify(txtName.Text);

        }

 

2-Les generics

Les generics permettent la réutilisation du code en ne spécifiant pas un type précis .

Exemple : une classe généric et une méthode généric

public class Client

    {

        public string Name { get; set; }

        public string Email { get; set; }     

    }

    public class GenericCollectionDemo<T> : List<T>

    {

        public void Add<T>(T obj)

        {

            if (obj.GetType().Name=="Client")

              this.Add(obj);

        }

        public T GetObj(int index)

        {

            return this[index];

        }

    }

 

Utilisation

GenericCollectionDemo<Client> collectionDemo = new GenericCollectionDemo<Client>();

collectionDemo.Add(new Client() { Name = "Bellin Marie", Email = "bellinmarie@live.com" });

Autre exemple

List<int> numbers = new List<int>() { 1, 3, 5 };

 

default

Renvoie null pour un type référence, 0 pour un type valeur tel que int, false pour un bool,…

return default(T);

 

Restrictions

Permet de restreindre l’accès

where T : struct

T doit être un type valeur

where T : class

T doit être un type référence

where T : new()

T doit avoir un constructeur par défaut (sans paramètres)

where T : INomInterface

T doit implémenter l’interface

where T : NomClasse

T doit dériver de la classe

where T1 : T2

T1 doit dériver de T2

 

Exemple

public class DemoGeneric<T>

    {

        public T DemoDefault<T>() where T : struct

        {

            return default(T);

        }

    }

 

DemoGeneric<bool> boolean = new DemoGeneric<bool>();

bool result = boolean.DemoDefault<bool>();

 

3-Les itérateurs

       public interface IEnumerable

        {

            IEnumerator GetEnumerator();

        }

 

        public interface IEnumerator

        {

            bool MoveNext();

            object Current { get; }

            void Reset();

        }

 

        public interface IEnumerable<T> : IEnumerable

        {

            IEnumerator<T> GetEnumerator();

        }

 

        public interface IEnumerator<T> : IEnumerator, IDisposable

        {

            T Current { get; }

        }

 

Exemple

List<int> numbers = new List<int>() { 1, 3, 5, 8 };

 

            IEnumerator enumerator = numbers.GetEnumerator();

 

            while (enumerator.MoveNext())

            {

                object current = enumerator.Current;

            }

 

Yield return

Foreach se fait sur un enumerable . Yield return renvoit un résultat.Une sorte de ping pong a donc lieu entre la boucle foreach et la méthode appelée

public class ContactCollection : List<Contact>

    {

        public IEnumerable GetContacts()

        {

            for (int i = 0; i < this.Count; i++)

                yield return this[i];

        }

    }

 

ContactCollection contacts = new ContactCollection(){

                new Contact(){ ContactName ="Marie",ContactFirstName="Bellin" },

                new Contact(){ ContactName ="Paul",ContactFirstName="Dupond" }

            };

 

           

            foreach (Contact contact in contacts.GetContacts())

            {      

                listBox1.Items.Add(contact.ContactFirstName);

            }

 

4-Les classes partielles

Cela permet d’écrire une classe sur plusieurs fichiers.

Exemple Form1.Designer .cs

partial class Form1

{

   /// <summary>

        /// Variable nécessaire au concepteur.

        /// </summary>

        private System.ComponentModel.IContainer components = null;

 

/// …

}

 

Et Form1.cs contenant le code behind

public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

}

 

3-Les types nullables

Très utile par exemple pour les données récupérées de base de données qui peuvent être null

System.Nullable<int> i = null;

// ou abrégé

int? i = null;

 

 

if (i.HasValue)

  // si i n'est pas null ...

 

i.GetValueOrDefault(); // renvoit la valeur ou bien 0

 

i = null; // on peut affecter la valeur null

 

4-L'opérateur ::

L'opérateur :: permet d'appeler l'espace de nom global pour éviter les conflits avec des variables locales qui auraient le même nom

Exemple

::Console.WriteLine("Hello World");

 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:27

I - Nouveautés  de C# 3.0

 

Les nouveautés permettent notamment d’écrire moins de code (celui-ci étant généré par le compilateur).

Reflector ou ILSpy sont tout indiqués pour observer le code IL généré.

 

1-Les accesseurs simplifiés :

Avant nous aurions écrit :

        private string _contactName ;

 

        public string ContactName

        {

            get { return _contactName; }

            set { _contactName = value; }

       

        }

 

Avec cette nouveauté nous pouvons réduire à :

public string ContactName { get; set; }

 

Exemple complet

public class Contact

    {

        public string ContactName { get; set; }

 

        public Contact(string contactName)

        {

            this.ContactName = contactName;

        }

    }

Création d’un contact

 Contact contact = new Contact("Bellin");

 

Vous pouvez utiliser Reflector ou ILSpy pour regarder le code IL généré (Un membre est ajouté)

2-Les méthodes partielles.

Déclarées sans portée, partial  et void(ne peuvent rien retourner)

La classe contenant une méthode partielle doit également être déclarée comme partial

Exemple :

    public partial class Contact

    {

        public string ContactName { get; set; }

 

        partial void SetName(string contactName);

    }

    public partial class Contact

    {

        partial void SetName(string contactName)

        {

            ContactName = contactName;

        }

    }

 

 

3-Les initialiseurs d’objets et de collections

Permettent de donner une valeur aux propriétés dès l’initialisation sans passer par le constructeur

Initialiseur d’objet

Contact contact = new Contact() {ContactName ="Marie",ContactFirstName="Bellin" };

 

Initialiseur de collection

List<Contact> contacts = new List<Contact>(){

                new Contact(){ ContactName ="Marie",ContactFirstName="Bellin" },

                new Contact(){ ContactName ="Paul",ContactFirstName="Dupond" }

            };

 

La classe Contact utilisée

public class Contact

{

        public string ContactName { get; set; }

        public string ContactFirstName { get; set; }

}

 

On pourrait pu également faire appel à un constructeur si la classe en avait un de cette manière

List<Contact> contacts = new List<Contact>(){

                new Contact("Marie","Bellin"),

                new Contact("Paul","Dupond")

            };

 

… voir faire des mélanges (ne pas oublier de déclarer un constructeur vide)

List<Contact> contacts = new List<Contact>(){

                new Contact("Marie","Bellin"),

                new Contact(){ ContactName ="Paul",ContactFirstName="Dupond" }

            };

 

4- L’inférence de type

 

On déclare une variable avec le mot var, celle-ci doit être initialisée en même temps pour que le compilateur puisse déterminer son type.

Exemple

var message = "Bonjour à tous !"; // le type de la variable sera System.String ;

5- Les types anonymes (AnonymousType)

Les types anonymes dérivent de System.Object .Ils servent à créer un type pour stocker une liste d’informations .Cette notion est importante à comprendre, on récupère une liste d’informations, il faut travailler avec ces informations en sachant qu’un type a été créé  et ne pas vouloir faire une conversion.

var client = new {ClientName="Bellin",Email="bellinmarie@live.com"};

// un type anonyme est généré à la compilation, on a accès aux informations de la même manière qu’à une classe « classique »

MessageBox.Show(client.Email);

 

On peut faire une requête Linq et créer un type contenant les informations

Exemple : on crée un nouveau type et on récupère la liste en résultat (que l’on affiche dans une listBox)

  var clients = from c in contacts

                         where c.ContactFirstName.StartsWith("B")

                         select new{ClientName = c.ContactName,ClentFirstName= c.ContactFirstName} ;

 

            //

            foreach (var client in clients)

            {

                listBox1.Items.Add(client.ClentFirstName + " " + client.ClientName);

            }

 

6-Les méthodes d’extension

Permettent d’étendre des méthodes (ajouter des signatures de méthode) à du code dont on n’a pas la source .Cela peut servir à étendre des méthodes du Framework.NET par exemple.

Une méthode d’extension doit être :

Contenu dans une classe Static

cette méthode est Static et contient donc en premier paramètre l’objet sur laquelle elle s’applique

Un exemple très simple .J’étends la méthode Substring de la classe String pour qu’elle retourne mon nom de client.

 

  public static class ExtensionMethodsDemo

    {

        public static string Substring(this string s)

        {

            return s.Substring(6,6);

        }

    }

 

string client = "Marie Bellin";

string firstName = client.Substring();

 

L’important ici est de voir que la méthode a bien été ajoutée

  cs1

7-Les expressions lambda

Une expression lambda est une fonction ne possédant pas de nom, exécutant un traitement et retournant une valeur.

 

Elle se présente en 3 parties

- liste de paramètres

- opérateur =>

- expression

  Les expressions lambda sont utiles pour des calculs et sur des énumérables .  

 

Exemple :

Expression Lambda  

List<Contact> selectedContacts = contacts.Where(c => c.ContactFirstName.StartsWith("B")).ToList();

 

A savoir que l’on peut très bien utiliser LINQ, les expressions lambdas et les méthodes anonymes pour obtenir le même résultat  .Il est même possible de les « mixer »  

Exemple :

LINQ

List<Contact> selectedContacts = (from contact in contacts where contact.ContactFirstName.StartsWith("B") select contact).ToList();

 Méthode anonyme    

List<Contact> selectedContacts = contacts.Where<Contact>(delegate(Contact contact) { return contact.ContactFirstName.StartsWith("B"); }).ToList();

 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:20

Attention ne marche que pour  variable locale ( déclarées dans une fonction et la variable doit être initialisée au moment de la déclaration)

       static void Main(string[] args)

        {

            var i = 10;      

            //

            Console.WriteLine(i.GetType());           

            Console.ReadLine();

        }

 

2-Conversion de données

a-Cast implicite

   int age = 42;

   long longAge = age;

 

b-Cast explicite

float resultatPrecis = 17.83f;

            //  int resultat = resultatPrecis; // renvoit une erreur on essaie de stocker deux chiffres après la virgule dans un entier

            int resultat = (int)resultatPrecis; // conversion explicite

            // resultat devient égal à 17

 

conersion

c-Conversion de chaine > en nombre

Utilisation de fonction « Parse » précédée du type voulu

string s = "10";      

int i = int.Parse(s);

 

Conversion de nombre > en chaine

Utilisation fonction « ToString() »

  int i = 10;

         string s = i.ToString();

 

 

d-Conversion en objet

La conversion d’une variable en objet est appelée « Boxing ». L’action qui permet de retransformer l’objet en variable s’appelle l’ « Unboxing », ( « sortir de la boite »)

            int i = 12;                  

            //Boxing      

            object o = i;                    

            //Unboxing      

            int n = (int)o;

 

3-Type valeur et type référence

Type valeur(données stockés dans la pile) :

Tous les types numériques, caractères, booléens,structures, énumérations

 

Type référence(données stockées dans le tas avec une référence pointant vers celle-ci) se trouve dans la pile) :

 les String,tableaux,classes,délégués

  typesref.png

4-Structures de données

a-tableaux

//

            int[] t = new int[3];

            // intialisation

            int[] t = new int[] {1,3,5 };

            // version syntaxe simplifiée

            int[] t = { 345, 0, -25, 7, 42, 23, 1337 };

           

            // parcours des éléments

            int i;

            for(i=0; i < t.GetLength(0); i++)

            {}

            // ou

            foreach (int i in t)

            { }

 

b-Listes

            List<int> l = new List<int>();

            //parcours

            int i;

            for (i = 0; i < l.Count(); i++)

            { }

            // ou

            foreach (int i in l)

            { }

 

c-énumérations (enum)                         

// déclaration d’une énumération ne peut s’effectuer à l’intérieur d’une fonction

        enum Jours { lun, mar, mer, jeu, ven, sam, dim }; 

 

        private void Test()

        {

 

            Jours jourDeStage; //variable de type "Jours"            

            jourDeStage = Jours.lun;

            // ou par le numéro

            jourDeStage = (Jours)0;

        }

 

           // on peut aussi redéfinir la valeur

               enum Jours { lun=3, mar, mer, jeu, ven, sam, dim }; 

 

c-les structures

struct Coureur

        {

            public string nom;

            public string prénom;

            public int Dossard;

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

 

            Coureur lucas;  

            

            lucas.nom = "Dupont";            

            lucas.prénom = "Lucas";            

            lucas.Dossard = 3;

 

        }

5-les méthodes

TypeDeRetour NomDeMaMethode ()

       {

          

           return variableRetournee;

       }

 

Passage de paramètre par valeur

On travaille avec une copie de la variable dans la fonction, la valeur en sortie sera inchangée

Passage de paramètre par référence : si on modifie la valeur de la variable dans la fonction celle-ci sera modifiée également sorti de la fonction

       int methode(ref int x)

        {

            x = 5;

            return x;

        }

 

6-gestion des erreurs

            try

            { }

            catch (Exception)

            { }

            catch (Exception)

            { }

            finally

            { }

 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:19

Image extraite de l'article "Les nouveautés de C# 5.0" ici 

 

evolutioncs

 

C# 6.0 - Probable C# 6.0 features illustrated

http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:18

Exemple avec le menu Nouveau

 

Définir le raccourci(exemple :Ctrl + N) dans la propriété ShortCutKeys

 

Mettre "&" devant la lettre "N" dans la propriété Text pour indiquer à l'utilisateur le raccourci .

En pressant la touche Alt + la lettre "soulignée" suivant le "&" (dans notre exemple alt+ N)  on déclenche l'événement du control .En fait il faudra faire plus précisément Alt+F dabord pour ouvrir le menu puis Alt+N

 

shortcut.png  

 

La propriété ShowShortCutKeys peut être réglée à true ou false si on ne veut pas que le raccourci(exemple "Ctrl+N" à gauche du texte "Nouveau"  du menu) soit affiché .

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:06

Ne pas oublier using System.Net.Mail;

private void btnSend_Click(object sender, EventArgs e)

        {

            SendMessage("dupond@wanadoo.fr", "durand@yahoo.fr", "test sujet", "coucou body");

        }

 

        /// <summary>

        ///

        /// </summary>

        /// <param name="from"></param>

        /// <param name="to"></param>

        /// <param name="subject"></param>

        /// <param name="body"></param>

        public void SendMessage(string from, string to, string subject, string body)

        {

            string host = "smtp.orange.fr";

            SmtpClient client = new SmtpClient(host);

            MailMessage message = new MailMessage(from, to, subject, body);

 

            try

            {

                client.Send(message);

            }

 

            catch (Exception ex)

            {

                throw ex;

            }

 

        }

 

Il est également possible d’envoyer un message au format html

 

message.IsBodyHtml = false;

 

Et d’envoyer des pièces jointes (ici on passe le chemin complet du fichier à envoyer (sachant  qu’il faut faire une boucle en cas de plusieurs pièces jointes)

            message.Attachments.Add(new Attachment(path));

 

Astuce : obtenir le chemin des répertoires spéciaux, exemple mes images

Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

 

Autre astuce,il peut arriver que l'on ait besoin de faire des conversions par programmation (exemple de rtf vers html avec le texte récupéré dans une textbox)

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:05

Ne pas oublier using System.IO; et using System.Drawing;

 

        public static byte[] ConvertImageTobyte(string path)

        {

            byte[] result = null;

            using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))

            {

                result = new byte[fileStream.Length];

                fileStream.Read(result, 0, (int)fileStream.Length);

            }

 

            return result;

        }

        public static Bitmap ConvertbyteToImage(byte[] imageBuffer)

        {

            Bitmap result = null;

            using (MemoryStream memoryStream = new MemoryStream(imageBuffer, true))

            {

                memoryStream.Write(imageBuffer, 0, imageBuffer.Length);

                result = new Bitmap(memoryStream);

            }

            return result;

        }

 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:03

1-      Faire hériter la classe de INotifyPropertyChanged

(ne pas oublier using System.ComponentModel;)

 

public class Contact : INotifyPropertyChanged

    {

2 –Implémenter INotifypropertyChanged

        #region INotifyPropertyChanged Membres

 

        public event PropertyChangedEventHandler PropertyChanged;

 

        protected void onPropertyChanged(string propertyName)

        {

            if (PropertyChanged != null)

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }

 

        #endregion

3 – Ajouter à chaque propriété OnPropertyChanged(« nom de la propriété »)

Exemple

public string contactName

        {

            get { return _contactName; }

            set { _contactName = value;

            onPropertyChanged("contactName");

            }

        }

 

Ainsi l’affichage de l’iu se mettra automatiquement à jour  

 

Astuce : en cas d'héritage, faire hériter seulement la classe de base de INotifyPropertyChanged et implémenter celle ci dans dans la classe de base, les classes dérivées pouvan faire appel à OnPropertyChanged 

http://msdn.microsoft.com/fr-fr/library/ms133020(VS.80).aspx 

Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:02

La classe de l’attribut personnalisé hérite de System.Attribute

exemple

 

// l'attribut personnalisé pourra être appliqué aux propriétés

    [AttributeUsage(AttributeTargets.Property)]

    public class MyAttribute : Attribute

    {

        private int _index;

        private string _myText;

 

        public int index

        {

            get { return _index; }

        }

        public string myText

        {

            get { return _myText; }

        }

 

        public MyAttribute(int index,string myText)

        {

            _index = index;

            _myText = myText;

        }

    }

 

Utilisation

       [MyAttribute(1,"Mon texte")]

        public string contactName

        {

            get { return _contactName; }

            set { _contactName = value; }

        }

 

Après il faut récupèrer ses attributs pour pouvoir les utiliser

Exemple dans MainForm.cs

(ne pas oublier using System.ComponentModel; et les éventuelles références à une bibliothèque de classe)

  private void GetMyAttributes()

        {                    

            string[] result = null;

 

            Type genericType = typeof(Contact);

 

            List<PropertyDescriptor> properties = new List<PropertyDescriptor>();

            // parcours de chaque propriété de notre classe Contact(c'est à dire contactId,puis contactName,etc.) , si l'attribut personnalisé est présent, on ajoute la propriété

            foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(genericType))

                if (propertyDescriptor.Attributes[typeof(MyAttribute)] != null)

                    properties.Add(propertyDescriptor);

           

            // S'il y a des propriétés à afficher

            if (properties.Count > 0)

            {

              

                result = new string[properties.Count];

 

                int counter = 0;

                foreach (PropertyDescriptor propertyDescriptor in properties)

                {

                    // On récupère les valeurs de notre attribut personnalisé

                    MyAttribute myAttribute = (propertyDescriptor.Attributes[typeof(MyAttribute)] as MyAttribute);

 

                    // ici j'utilise un tableau mais on pourrait utiliser les valeurs obtenues comme désiré

                    result[counter++] = string.Concat(myAttribute.index.ToString(), " - ", myAttribute.myText);

                }

            }

 

         

        }

 

Partager cet article
Repost0