Comme des millions de développeurs, vous utilisez C# quotidiennement … mais en maitrisez-vous les subtilités ? Cette session ludique vous plongera au cœur de votre langage de prédilection au travers programmes et exemples de code qui ne cesseront de vous surprendre. Avec en prime quelques (petits) lots à gagner pour les développeurs les plus perspicaces !
1. C# et .NET
Enigmes et Puzzles
Clément Gatin, Luc Vo Van
Consultants Dev
Microsoft
Code / Développement
2. Donnez votre avis !
Depuis votre smartphone, sur :
http://notes.mstechdays.fr
De nombreux lots à gagner toutes les heures !!!
Claviers, souris et jeux Microsoft…
Merci de nous aider à améliorer les TechDays
http://notes.mstechdays.fr
3. Présentation de Microsoft Enterprise Services
Application Critiques (Tier1)
Relation client et ressources (ERP / CRM)
Collaboration & social
Entreprise Microsoft
Support Premier
Strategy Consulting Services Productivité dans le Cloud
Productivité On Premise
Environnement de travail
Datacenter et Cloud
4. 4 ouvrages écrits par 13 Microsoftees
http://www.editions-eyrolles.com/livres/Windows-8-pour-les-professionnels
5. Agenda
Introduction et objectifs
Les énigmes
1. Typage explicite (ou pas)
2. Plus Plus
3. Remise à Zéro
4. (D)étonnante combinaison
5. C# dans tous ses états
6. Bouquet final
7. Pourquoi cette session ?
Approfondir la connaissance d’un outil fondamental
Apprécier la sophistication du compilateur
Repartir avec quelques bonnes pratiques
Se tester !
9. Enigme 0 : Où trouver la spécification ?
A. Sur Internet
B. Sur le blog d’Anders Hejlsberg
C. Je l’ai toujours sur moi
D. Dans l’aide F1 de Visual Studio
10. Enigme 0 : Où trouver la spécification ?
A. Sur Internet
B. Sur le blog d’Anders Hejlsberg
C. Je l’ai toujours sur moi
D. Dans l’aide F1 de Visual Studio
C:Program Files (x86)Microsoft Visual Studio 11.0VC#Specifications
15. Enigme 1 : Quel mot clé est recommandé
?
A. Typage explicite
B. var
C. Aucun
16. Enigme 1 : Quel mot clé est recommandé
?
A. Typage explicite
B. var
C. Aucun
17. En synthèse
ILDASM (Intermediate Language Disassembler) est livré avec Visual Studio et
permet de parcourir l’IL
var ou déclaration explicite : c’est pareil
var != dynamic. Réservez dynamic à l’interop !
38. Enigme 3 : Est-ce que ça compile ?
A. Oui
B. Non
C. Ca dépend des options du compilateur
D. Ca veut dire quoi « ça compile » ?
39. Enigme 3 : Est-ce que ça compile ?
A. Oui
B. Non
C. Ca dépend des options du compilateur
D. Ca veut dire quoi « ça compile » ?
40. En synthèse
Le compilateur sait (assez) bien déterminer si les chemins
de construction initialisent tous les membres
C’est un mécanisme fondamental du déterminisme de .NET
:this() permet d’enchaîner les ctor pour les objets
complexes
this = new peut impressionner en soirée
- 40
45. Enigme 4 : Qu’affiche le programme ?
A. False, False
B. False, True
C. False, NullReferenceException
D. La réponse D
46. Enigme 4 : Qu’affiche le programme ?
A. False, False
B. False, True
C. False, NullReferenceException
D. La réponse D
47. En synthèse
Performance sur les objets valeurs
Pas de garbage collection
Pas d’indirection de pointeur
Les objets valeurs sont manipulés par copie, donc
Attention aux mises à jour
Les copies sont consommatrices en performance et en
mémoire. 10 appels imbriqués = 10 copies = 10x en RAM
La copie de valeur peut engendrer des bugs difficiles à
diagnostiquer
- 47
48. Préconisations
Utilisez les structs pour des objets de petite taille
Evitez les confusions en n’ayant que des structs dont les
champs sont en lecture seule
- 48
51. Enigme 5 : Qu’affiche ce programme
A. Nom1, Nom2, Clement, Luc
B. Nom1, Clement, Nom2, Luc
C. Clement, Luc
D. Nom1, Nom2
52. Enigme 5 : Qu’affiche ce programme
A. Nom1, Nom2, Clement, Luc
B. Nom1, Clement, Nom2, Luc
C. Clement, Luc
D. Nom1, Nom2
53. Une machine à états ?
4
2
1 3 5
Une machine à états est un ensemble d’états n et de transitions
- 53
54. Une machine à états ?
public static IEnumerable<string> GetNames()
{
1
Console.WriteLine("Nom 1");
yield return "Clement";
2
Console.WriteLine("Nom 2");
yield return "Luc";
3
}
- 54
55. yield return
Chaque yield return correspond à un état
Le code entre deux yield return correspond à une
transition
Le compilateur créé une classe machine à états
MoveNext passe à l’état suivant
L’état en cours est sauvegardé
Les variables locales de la fonctions sont des
membres
Chaque appel de MoveNext fait un Goto - 55
57. async await
Chaque appel à une méthode préfixée de await est un état
Le code entre deux appels est une transition
Lors d’un appel à une méthode async, si après l’appel celle
si n’est pas terminée (IsCompleted = false), un « awaiter »
est créé, qui rappellera la machine à état à la fin de la tâche,
pour continuer à l’état courant
- 57
58. En synthèse
Le compilateur génère des machines à état, qui permettent
d’implémenter les scénarios de « reprise »
yield return et async sont des constructions bien plus
sophistiquées qu’elles n’en ont l’air
L’intelligence et la quantité de code fournie par le
compilateur est appréciable… et permet d’être plus productif
- 58
61. Enigme 6 : Qu’affiche ce programme
A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a
13 ans
B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10
ans
C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a
13 ans
D. Ne compile pas
62. Enigme 6 : Qu’affiche ce programme
A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ans
B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10
ans
C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13
ans
D. Ne compile pas
64. Enigme 6 : Qu’affiche ce programme
A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ans
B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10
ans
C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ans
D. Ne compile pas
65. class Main_Scope2
class Main_Scope1 {
{ string name;
Visual Studio 2012 string messageFormat; Main_Scope1 parentScope;
List<Action> actions; }
}
static string[] _Names = new[]
{ "Alice", "Bob", "Charlie" };
static void Main(string[] args)
{
string messageFormat = "Hello {0}"; messageFormat = "Hello {0}"
List<Action> actions = new List<Action>();
actions = { }
for (int i = 0; i < _Names.Length; ++i)
{
string name = _Names[i];
actions.Add(() =>
Console.WriteLine(messageFormat, name));
}
parentScope parentScope parentScope
foreach (var action in actions) Name = Name = Name =
action(); "Alice" "Bob" "Charlie"
Console.ReadLine();
}
Action Action Action
66. class Main_Scope1 class Main_Scope2
{ {
string messageFormat;
Visual Studio ≤ 2010 List<Action> actions; }
Main_Scope1 parentScope;
string name;
}
static string[] _Names = new[]
{ "Alice", "Bob", "Charlie" };
static void Main(string[] args)
{ messageFormat = "Hello {0}"
string messageFormat = "Hello {0}";
actions = { }
List<Action> actions = new List<Action>(); name ="Charlie"
string name;
for (int i = 0; i < _Names.Length; ++i)
{
name = _Names[i];
actions.Add(() =>
Console.WriteLine(messageFormat, name));
}
parentScope parentScope parentScope
foreach (var action in actions)
action();
Console.ReadLine();
}
Action Action Action
67. En synthèse
Les closures sont un outil pratique et élégant dont la
mécanique est implémentée par le compilateur
Les breaking changes au niveau compilation sont
extrêmement rares, et sont pris très au sérieux par Microsoft
- 67
69. En synthèse
Les évolutions du langage C# sont principalement liées au
compilateur lui-même, avec peu de support spécifique de la
CLR
Parti d’une programmation purement itérative proche du
langage machine, le C# permet aujourd’hui d’exprimer
élégamment des principes complexes par la génération de
code
Asynchronisme
Closures
Générateurs
- 69
70. Pour finir http://notes.mstechdays.fr
int i = 0;
Console.Write(string.Format("{0} {1} {2} {3}",
++i,
i++ * ++i,
i,
i++ + i++));
71. Donnez votre avis !
Depuis votre smartphone, sur :
http://notes.mstechdays.fr
De nombreux lots à gagner toutes les heures !!!
Claviers, souris et jeux Microsoft…
Merci de nous aider à améliorer les TechDays
http://notes.mstechdays.fr
72. Développeurs Pros de l’IT
http://aka.ms/generation-app Formez-vous en ligne www.microsoftvirtualacademy.com
http://aka.ms/evenements-
developpeurs Retrouvez nos évènements http://aka.ms/itcamps-france
Les accélérateurs
Faites-vous accompagner
Windows Azure, Windows Phone,
gratuitement
Windows 8
Essayer gratuitement nos http://aka.ms/telechargements
solutions IT
La Dev’Team sur MSDN Retrouver nos experts L’IT Team sur TechNet
http://aka.ms/devteam Microsoft http://aka.ms/itteam