34
L’architecture .NET: L’architecture .NET: Le typage Le typage © © Patrick Smacchia 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. acter moi avant toute utilisation non personnelle de ces supports : patrick @ smacchia.co

Larchitecture.NET: Le typage © Patrick Smacchia © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Embed Size (px)

Citation preview

Page 1: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

L’architecture .NET:L’architecture .NET:Le typageLe typage

© © Patrick SmacchiaPatrick Smacchiahttp://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 : [email protected]

Page 2: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

2

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifsLes membresLes membres

Page 3: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

3

La problématiqueLa problématique

L’ensemble des types (standard ou L’ensemble des types (standard ou propriétaires) doit s’affranchir de la propriétaires) doit s’affranchir de la notion de langage.notion de langage. Un type défini en C# doit être utilisable Un type défini en C# doit être utilisable

par une application développée en par une application développée en VB.NET.VB.NET.

Un type défini en C# doit pouvoir dériver Un type défini en C# doit pouvoir dériver d’un type défini en VB.NET.d’un type défini en VB.NET.

La représentation physique (octet par La représentation physique (octet par octet) des instances d’un type doit être la octet) des instances d’un type doit être la même indépendamment du langage.même indépendamment du langage.

CTS (Common Type System)

Page 4: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

4

Les problèmesLes problèmes Or, l’évolution des langages montre qu’ils Or, l’évolution des langages montre qu’ils

ont chacun leurs spécificités:ont chacun leurs spécificités: Types primitifs en Java et C++ (Types primitifs en Java et C++ (float, , int…) et …) et

pas en SmallTalk.pas en SmallTalk. Héritage multiple d’implémentation en C++ et Héritage multiple d’implémentation en C++ et

Eiffel et pas en Java.Eiffel et pas en Java. Accès direct à la mémoire (pointeurs) en C++ et Accès direct à la mémoire (pointeurs) en C++ et

pas en Java.pas en Java. Types génériques (templates) en C++ et pas en Types génériques (templates) en C++ et pas en

Java.Java. Java utilise constamment 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.C ne connaît pas la notion de référence. Des choix et des compromis ont dDes choix et des compromis ont dûû être être

faits.faits.

CTS (Common Type System)

Page 5: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

5

Vue globale du CTSVue globale du CTSCTSCTS

CTS (Common Type System)

Types valeurTypes valeur Types référenceTypes référence

Types valeurTypes valeur

StandardStandard

Types valeur Types valeur

PropriétairesPropriétaires

ClassesClasses InterfacesInterfaces PointeursPointeurs

Types référencesTypes références

PropriétairePropriétaire

Page 6: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

6

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifs

Page 7: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

7

Pile et tasPile et tas

En .NET, les variables et les objets En .NET, les variables et les objets peuvent être physiquement stockés peuvent être physiquement stockés dans deux types de zone mémoire:dans deux types de zone mémoire: La pile (stack) d’un thread.La pile (stack) d’un thread. Le tas d’un processus.Le tas d’un processus.

(On ne parle pas ici des registres des (On ne parle pas ici des registres des processeurs)processeurs)

Types valeur vs. Types référence

Page 8: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

8

Pile et tasPile 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 Accès optimisés (directement au niveau des

instructions machines).instructions machines). Pas de problème d’accès concurrents à une pile Pas de problème d’accès concurrents à une pile

(puisqu’il y a une pile par thread).(puisqu’il 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 l’ordre du Mo).La pile est limité en taille (de l’ordre du Mo). La pile est utilisé pour stocker des petits La pile est utilisé pour stocker des petits

objets accédés souvent (objets accédés souvent (int, , double, , bool…)…) Le tas est utilisé pour stocker des gros objets Le tas est utilisé pour stocker des gros objets

globaux au processus.globaux au processus.

Types valeur vs. Types référence

Page 9: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

9

Types valeur et types Types valeur et types référenceréférence

L’endroit où est stocké un objet (pile ou L’endroit où est stocké un objet (pile ou tas) dépend de son type:tas) dépend de son type: Les instances des types valeurs sont par défaut Les instances des types valeurs sont par défaut

stockées sur la pile.stockées sur la pile. Les instances des types références sont Les instances des types références sont

TOUJOURS stockées sur le tas. Chacune de ces TOUJOURS stockées sur le tas. Chacune de ces instances admet une référence dans une pile.instances admet une référence dans une pile.

Notez que les champs de types valeurs Notez que les champs de types valeurs d’un type références sont physiquement d’un type références sont physiquement stockés sur le tas.stockés sur le tas.

Types valeur vs. Types référence

Page 10: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

10

Types valeur et types Types valeur et types référenceré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 Les types références sont les classes (standard, propriétaire, (standard, propriétaire, string, , tableau…).tableau…).

Types valeur vs. Types référence

Page 11: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

11

Accès, AffectationAccès, Affectation

Les instances des types valeurs sont Les instances des types valeurs sont toujours accédées directement. Les toujours accédées directement. Les instances des types références sont instances des types références sont toujours accédées par l’intermédiaire toujours accédées par l’intermédiaire d’une référence.d’une référence.

L’affectation entre instances de types L’affectation entre instances de types valeur se traduit par une copie du contenu.valeur se traduit par une copie du contenu.

L’affectation entre instances de types L’affectation entre instances de types référence se traduit par une copie de la référence se traduit par une copie de la référence.référence.

Types valeur vs. Types référence

Page 12: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

12

Accès, Affectation: Accès, Affectation: ExempleExemplestruct type_val // type_val est un type valeur, car c’est 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 c’est 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 d’instances 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 d’instances de type_ref?

}}

Types valeur vs. Types référence

Page 13: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

13

ComparaisonComparaison

Les instances des types valeurs se Les instances des types valeurs se comparent sur leurs contenus comparent sur leurs contenus (égalité). Les instances des types (égalité). Les instances des types références se comparent sur leurs références se comparent sur leurs identités.identités.

Types valeur vs. Types référence

Page 14: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

14

Comparaison: ExempleComparaison: Exempleusing 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

Page 15: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

15

Passage d’argumentPassage d’argument

Les instances des types valeurs sont Les instances des types valeurs sont par défaut passées par valeur. Les par défaut passées par valeur. Les instances des types références sont instances des types références sont toujours passées par référence.toujours passées par référence.

Types valeur vs. Types référence

Page 16: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

16

Passage d’argument: Passage d’argument: ExempleExemplepublic 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

Page 17: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

17

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifs

Page 18: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

18

La classe System.ObjectLa classe System.Object

Tous les types (références et valeurs) Tous les types (références et valeurs) dérivent automatiquement et dérivent automatiquement et implicitement de la classe implicitement de la classe System.Object..

C# définit les alias C# définit les alias object et et Object vers vers System.Object..

La classe System.Object

Page 19: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

19

Les méthodesLes méthodes System.Type GetType()

Renvoie le type de l’objet. virtual String ToString()

Obtient une chaîne de caractères qui décrit l’objet.

virtual void Finalize()Libère les ressources allouées à l’objet.

virtual bool Equals(object obj)  Compare l’objet courant à obj.

virtual int GetHashCode() Obtient une valeur de hachage sur l’objet.

La classe System.Object

Page 20: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

20

La méthode ToString()La méthode ToString()using System; class CPersonne // on aurait pu mettre struct à la place de class{ string m_Nom; int m_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

Page 21: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

21

La méthode Finalize() 1/3La méthode Finalize() 1/3

Cette méthode est appelée par le Cette méthode est appelée par le ramasse-miettes juste avant que ramasse-miettes juste avant que l’objet soit détruit.l’objet soit détruit.

On peut l’utiliser pour libérer des On peut l’utiliser pour libérer des ressources.ressources.

Inconvénient majeur: le ramasse-Inconvénient majeur: le ramasse-miettes étant non déterministe, on miettes étant non déterministe, on ne peut contrôler le moment de son ne peut contrôler le moment de son appel. appel.

La classe System.Object

Page 22: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

22

La méthode Finalize() 2/3La méthode Finalize() 2/3 En C# la méthode virtuelle En C# la méthode virtuelle Finalize() ne ne

peut être redéfinit directement. Pour la peut être redéfinit directement. Pour la redéfinir, il faut utiliser la syntaxe du redéfinir, il faut utiliser la syntaxe du destructeur:destructeur:

...public class Article{public int Prix;public Article(int Prix){ this.Prix = Prix; } // constructeur ~Article() { }// destructeur

}...

La classe System.Object

Page 23: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

23

La méthode Finalize() 3/3La méthode Finalize() 3/3 Pour libérer les ressources d’une manière Pour libérer les ressources d’une manière

déterministe, il faut utiliser l’interface déterministe, il faut utiliser l’interface 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

Page 24: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

24

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifs

Page 25: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

25

La problématiqueLa problématique

Beaucoup de méthodes ont besoin Beaucoup de méthodes ont besoin d’arguments sous forme d’une référence d’arguments sous forme d’une référence de type de type System.Object..

Les instances des types valeurs Les instances des types valeurs n’admettent pas de référence du tout.n’admettent pas de référence du tout.

Or, les types valeur dérivent tous de Or, les types valeur dérivent tous de System.Object. Il serait dommage de ne . Il serait dommage de ne pas pouvoir référencer leurs instances pas pouvoir référencer leurs instances avec une référence de type avec une référence de type System.Object..

Boxing / Unboxing

Page 26: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

26

La solution: Le boxingLa solution: Le boxingclass 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

Page 27: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

27

DescriptionDescription

L’opération de boxing s’effectue en interne en L’opération de boxing s’effectue en interne en trois étapes :trois étapes : Une nouvelle instance du type valeur est créée et Une nouvelle instance du type valeur est créée et

allouée sur le tas.allouée sur le tas. Cette instance est initialisée avec l’état de l’instance Cette instance est initialisée avec l’état de l’instance

allouée sur le tas. Dans le cas de notre entier, une allouée sur le tas. Dans le cas de notre entier, une copie de quatre octets est effectuée.copie de quatre octets est effectuée.

Une référence vers la nouvelle instance est utilisée à Une référence vers la nouvelle instance est utilisée à la place de l’instance allouée sur le tas.la place de l’instance allouée sur le tas.

Boxing / Unboxing

Page 28: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

28

Boxing implicite: Boxing implicite: DANGERDANGER

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

Page 29: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

29

UnboxingUnboxing L’opération inverse du boxing existe.L’opération inverse du boxing existe. Elle ne peut se réaliser que si le type de l’objet boxé est Elle ne peut se réaliser que si le type de l’objet boxé est

exactement le type destination du unboxing: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

Page 30: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

30

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifs

Page 31: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

31

Représentation de nombres Représentation de nombres entiersentiers

Les types primitifs

Page 32: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

32

Représentation de nombres Représentation de nombres réelsréels

Les types primitifs

Page 33: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

33

PlanPlan

CTS (Common Type System)CTS (Common Type System)Types valeur vs. Types référenceTypes valeur vs. Types référenceLa classe System.ObjectLa classe System.ObjectBoxing / UnboxingBoxing / UnboxingLes types primitifsLes types primitifs

Page 34: Larchitecture.NET: Le typage © Patrick Smacchia  © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab)

Le typage

34

Question?Question?

Mots clésMots clés : :CTS (Common Type System)CTS (Common Type System)Pile/tasPile/tasType valeur/type référenceType valeur/type référenceÉgalité/identitéÉgalité/identitéSystem.ObjectSystem.ObjectType primitifType primitifBoxing/UnboxingBoxing/Unboxing