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
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(); |