Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parMargot Cousin Modifié depuis plus de 10 années
1
Larchitecture.NET: Le typage © Patrick Smacchia http://www.smacchia.com © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab) de cette formation peuvent être utilisés gratuitement dans le cadre de tout enseignement à but non lucratif. Contacter moi avant toute utilisation non personnelle de ces supports : patrick@smacchia.compatrick@smacchia.com
2
Le typage2 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs Les membres Les membres
3
Le typage3 La problématique Lensemble des types (standard ou propriétaires) doit saffranchir de la notion de langage. Lensemble des types (standard ou propriétaires) doit saffranchir de la notion de langage. Un type défini en C# doit être utilisable par une application développée en VB.NET. Un type défini en C# doit être utilisable par une application développée en VB.NET. Un type défini en C# doit pouvoir dériver dun type défini en VB.NET. Un type défini en C# doit pouvoir dériver dun type défini en VB.NET. La représentation physique (octet par octet) des instances dun type doit être la même indépendamment du langage. La représentation physique (octet par octet) des instances dun type doit être la même indépendamment du langage. CTS (Common Type System)
4
Le typage4 Les problèmes Or, lévolution des langages montre quils ont chacun leurs spécificités: Or, lévolution des langages montre quils ont chacun leurs spécificités: Types primitifs en Java et C++ (, …) et pas en SmallTalk. Types primitifs en Java et C++ ( float, int …) et pas en SmallTalk. Héritage multiple dimplémentation en C++ et Eiffel et pas en Java. Héritage multiple dimplémentation en C++ et Eiffel et pas en Java. Accès direct à la mémoire (pointeurs) en C++ et pas en Java. Accès direct à la mémoire (pointeurs) en C++ et pas en Java. Types génériques (templates) en C++ et pas en Java. Types génériques (templates) en C++ et pas en Java. Java utilise constamment la notion de référence. C ne connaît pas la notion de référence. Java utilise constamment la notion de référence. C ne connaît pas la notion de référence. Des choix et des compromis ont dû être faits. Des choix et des compromis ont dû être faits. CTS (Common Type System)
5
Le typage5 Vue globale du CTS CTS CTS (Common Type System) Types valeur Types référence Types valeur Standard Propriétaires ClassesInterfacesPointeurs Types références Propriétaire
6
Le typage6 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs
7
Le typage7 Pile et tas En.NET, les variables et les objets peuvent être physiquement stockés dans deux types de zone mémoire: En.NET, les variables et les objets peuvent être physiquement stockés dans deux types de zone mémoire: La pile (stack) dun thread. La pile (stack) dun thread. Le tas dun processus. Le tas dun processus. (On ne parle pas ici des registres des processeurs) Types valeur vs. Types référence
8
Le typage8 Pile et tas Avantages de la pile/désavantage du tas: Avantages de la pile/désavantage du tas: Accès optimisés (directement au niveau des instructions machines). Accès optimisés (directement au niveau des instructions machines). Pas de problème daccès concurrents à une pile (puisquil y a une pile par thread). Pas de problème daccès concurrents à une pile (puisquil y a une pile par thread). Avantages du tas/désavantage de la pile: Avantages du tas/désavantage de la pile: La pile est limité en taille (de lordre du Mo). La pile est limité en taille (de lordre du Mo). La pile est utilisé pour stocker des petits objets accédés souvent (,, …) La pile est utilisé pour stocker des petits objets accédés souvent ( int, double, bool …) Le tas est utilisé pour stocker des gros objets globaux au processus. Le tas est utilisé pour stocker des gros objets globaux au processus. Types valeur vs. Types référence
9
Le typage9 Types valeur et types référence Lendroit où est stocké un objet (pile ou tas) dépend de son type: Lendroit où est stocké un objet (pile ou tas) dépend de son type: Les instances des types valeurs sont par défaut stockées sur la pile. Les instances des types valeurs sont par défaut stockées sur la pile. Les instances des types références sont TOUJOURS stockées sur le tas. Chacune de ces instances admet une référence dans une pile. Les instances des types références sont TOUJOURS stockées sur le tas. Chacune de ces instances admet une référence dans une pile. Notez que les champs de types valeurs dun type références sont physiquement stockés sur le tas. Notez que les champs de types valeurs dun type références sont physiquement stockés sur le tas. Types valeur vs. Types référence
10
Le typage10 Types valeur et types référence Les types valeurs sont: Les types valeurs sont: Les types primitifs (,, …). Les types primitifs ( int, bool, double …). Les énumérations. Les énumérations. Les structures. Les structures. Les types références sont les classes (standard, propriétaire,, tableau…). Les types références sont les classes (standard, propriétaire, string, tableau…). Types valeur vs. Types référence
11
Le typage11 Accès, Affectation Les instances des types valeurs sont toujours accédées directement. Les instances des types références sont toujours accédées par lintermédiaire dune référence. Les instances des types valeurs sont toujours accédées directement. Les instances des types références sont toujours accédées par lintermédiaire dune référence. Laffectation entre instances de types valeur se traduit par une copie du contenu. Laffectation entre instances de types valeur se traduit par une copie du contenu. Laffectation entre instances de types référence se traduit par une copie de la référence. Laffectation entre instances de types référence se traduit par une copie de la référence. Types valeur vs. Types référence
12
Le typage12 Accès, Affectation: Exemple struct type_val // type_val est un type valeur, car cest une structure. { public int m_i; public type_val(int i) { m_i=i;} } class type_ref // type_ref est un type référence, car cest une classe. { public int m_i; public type_ref(int i) { m_i=i;} } class Prog { static void Main(string[] args) { type_val v1 = new type_val(6); type_val v2 = v1; v2.m_i = 9; // Que vaut v1.i? Combien y a t-il dinstances de type_val? type_ref r1 = new type_ref(6); type_ref r2 = r1; r2.m_i = 9; // Que vaut r1.i? Combien y a t-il dinstances de type_ref? } Types valeur vs. Types référence
13
Le typage13 Comparaison Les instances des types valeurs se comparent sur leurs contenus (égalité). Les instances des types références se comparent sur leurs identités. Les instances des types valeurs se comparent sur leurs contenus (égalité). Les instances des types références se comparent sur leurs identités. Types valeur vs. Types référence
14
Le typage14 Comparaison: Exemple using System; public class Article { public int Prix = 0; } class Prog { static void Main(string[] args) { int i1 = 10; int i2 = 10; Article Article1 = new Article(); Article1.Prix = 10; Article Article2 = new Article(); Article2.Prix = 10; string s1 = "Foo"; string s2 = "Foo"; bool bval = (i1 == i2); bool bref = (Article1 == Article2); bool bstr = (s1 == s2); // que valent bval, bref et bstr ? } Types valeur vs. Types référence
15
Le typage15 Passage dargument Les instances des types valeurs sont par défaut passées par valeur. Les instances des types références sont toujours passées par référence. Les instances des types valeurs sont par défaut passées par valeur. Les instances des types références sont toujours passées par référence. Types valeur vs. Types référence
16
Le typage16 Passage dargument: Exemple public class Article { public int Prix = 0; } class Prog { static void Main(string[] args) { // int est un type valeur. int ii = 10; // Article est un type référence. Article Article = new Article(); Article.Prix = 10; fct( ii, Article ); // Que vaut ii? Que vaut Article.Prix? } static void fct( int i, Article A ) { i = 100; A.Prix = 100; } Types valeur vs. Types référence
17
Le typage17 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs
18
Le typage18 La classe System.Object Tous les types (références et valeurs) dérivent automatiquement et implicitement de la classe. Tous les types (références et valeurs) dérivent automatiquement et implicitement de la classe System.Object. C# définit les alias et vers. C# définit les alias object et Object vers System.Object. La classe System.Object
19
Le typage19 Les méthodes System.Type GetType() Renvoie le type de lobjet. virtual String ToString() Obtient une chaîne de caractères qui décrit lobjet. virtual void Finalize() Libère les ressources allouées à lobjet. virtual bool Equals(object obj) Compare lobjet courant à obj. virtual int GetHashCode() Obtient une valeur de hachage sur lobjet. La classe System.Object
20
Le typage20 La méthode ToString() using System; class CPersonne // on aurait pu mettre struct à la place de class { stringm_Nom; intm_Age; public CPersonne(string Nom,int Age) { m_Nom = Nom; m_Age = Age; } public override string ToString() { return "Nom:" + m_Nom + " Age:" + m_Age; } class TheClass { static void Main(string[] args) { CPersonne Raymond = new CPersonne("Raymond",50); // WriteLine() appelle automatiquement Raymond.ToString() Console.WriteLine( Raymond ); } La classe System.Object
21
Le typage21 La méthode Finalize() 1/3 Cette méthode est appelée par le ramasse-miettes juste avant que lobjet soit détruit. Cette méthode est appelée par le ramasse-miettes juste avant que lobjet soit détruit. On peut lutiliser pour libérer des ressources. On peut lutiliser pour libérer des ressources. Inconvénient majeur: le ramasse-miettes étant non déterministe, on ne peut contrôler le moment de son appel. Inconvénient majeur: le ramasse-miettes étant non déterministe, on ne peut contrôler le moment de son appel. La classe System.Object
22
Le typage22 La méthode Finalize() 2/3 En C# la méthode virtuelle ne peut être redéfinit directement. Pour la redéfinir, il faut utiliser la syntaxe du destructeur: En C# la méthode virtuelle Finalize() ne peut être redéfinit directement. Pour la redéfinir, il faut utiliser la syntaxe du destructeur:... public class Article { public int Prix; public Article(int Prix) { this.Prix = Prix; }// constructeur ~Article() { }// destructeur }... La classe System.Object
23
Le typage23 La méthode Finalize() 3/3 Pour libérer les ressources dune manière déterministe, il faut utiliser linterface : Pour libérer les ressources dune manière déterministe, il faut utiliser linterface IDisposable :... public class Article : IDisposable { // Déclaration des champs et méthodes... public void Dispose() { /* désalloue ici ce qui doit l'être*/ } }... Article B = new Article(); using(B) { // Ici éventuellement utilisation de B. // Cette zone est appelée zone de validité de B. }// Cette accolade provoque l'appel automatique de B.Dispose(). // Fin de la zone de validité de B.... La classe System.Object
24
Le typage24 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs
25
Le typage25 La problématique Beaucoup de méthodes ont besoin darguments sous forme dune référence de type. Beaucoup de méthodes ont besoin darguments sous forme dune référence de type System.Object. Les instances des types valeurs nadmettent pas de référence du tout. Les instances des types valeurs nadmettent pas de référence du tout. Or, les types valeur dérivent tous de. Il serait dommage de ne pas pouvoir référencer leurs instances avec une référence de type. Or, les types valeur dérivent tous de System.Object. Il serait dommage de ne pas pouvoir référencer leurs instances avec une référence de type System.Object. Boxing / Unboxing
26
Le typage26 La solution: Le boxing class Prog { static void f(object o){} public static void Main( String[] argv ) { int i = 9 ; f(i); } Le code CIL de cette méthode Main() est le suivant :.locals init ([0] int32 i) IL_0000: ldc.i4.s 9 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: box [mscorlib]System.Int32 IL_0009: call void Prog::f(object) IL_000e: ret Boxing / Unboxing
27
Le typage27 Description Lopération de boxing seffectue en interne en trois étapes : Lopération de boxing seffectue en interne en trois étapes : Une nouvelle instance du type valeur est créée et allouée sur le tas. Une nouvelle instance du type valeur est créée et allouée sur le tas. Cette instance est initialisée avec létat de linstance allouée sur le tas. Dans le cas de notre entier, une copie de quatre octets est effectuée. Cette instance est initialisée avec létat de linstance allouée sur le tas. Dans le cas de notre entier, une copie de quatre octets est effectuée. Une référence vers la nouvelle instance est utilisée à la place de linstance allouée sur le tas. Une référence vers la nouvelle instance est utilisée à la place de linstance allouée sur le tas. Boxing / Unboxing
28
Le typage28 Boxing implicite: DANGER static void f(object o1,object o2){ if(o1==o2) Console.WriteLine("Même références"); else Console.WriteLine("Références différentes"); } public static void Main( String[] argv ){ int i = 9 ; f(i,i); } static void f(object o1,object o2){ if(o1==o2) Console.WriteLine("Même références"); else Console.WriteLine("Références différentes"); } public static void Main( String[] argv ){ int i = 9 ; object o = i; f(o,o); } Boxing / Unboxing
29
Le typage29 Unboxing Lopération inverse du boxing existe. Lopération inverse du boxing existe. Elle ne peut se réaliser que si le type de lobjet boxé est exactement le type destination du unboxing: Elle ne peut se réaliser que si le type de lobjet boxé est exactement le type destination du unboxing: class Prog { public static void Main( String[] argv ) { int i = 9 ; Object o = i; // i est Boxé int j = (int) o; // o est UnBoxé } Boxing / Unboxing
30
Le typage30 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs
31
Le typage31 Représentation de nombres entiers Les types primitifs
32
Le typage32 Représentation de nombres réels Les types primitifs
33
Le typage33 Plan CTS (Common Type System) CTS (Common Type System) Types valeur vs. Types référence Types valeur vs. Types référence La classe System.Object La classe System.Object Boxing / Unboxing Boxing / Unboxing Les types primitifs Les types primitifs
34
Le typage34 Question? Mots clés : Mots clés : CTS (Common Type System) Pile/tas Type valeur/type référence Égalité/identitéSystem.Object Type primitif Boxing/Unboxing
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.