relecture null_is par Stéphane

This commit is contained in:
Raphaël JAKSE 2015-09-21 19:59:09 +02:00
parent a9ef8d8f13
commit be01747cc0
1 changed files with 40 additions and 39 deletions

View File

@ -2,16 +2,17 @@
title = "La valeur [c null] et l'Opérateur [c is]"
partAs = chapitre
translator = "Raphaël Jakse"
proofreader = "Stéphane Goujet"
]
Dans le chapitre précédent, nous avons vu qu'une variable d'un type référence n'a pas besoin de référencer un objet :
[code=d <<<
MaClasse referencesAnObject = new MaClasse;
MaClasse referenceUnObjet = new MaClasse;
MaClasse variable; // ne référence pas un objet
>>>]
Étant un type par référence, [c variable] a, dans le code ci-avant, une identité mais ne référence pas encore d'objet. Un tel objet peut être représenté comme ceci dans sa case mémoire :
Étant d'un type par référence, [c variable] a, dans le code précédent, une identité mais ne référence pas encore d'objet. Un tel objet peut être représenté comme ceci dans sa case mémoire~ :
[pre <<<
variable
@ -20,9 +21,9 @@ Dans le chapitre précédent, nous avons vu qu'une variable d'un type référenc
---+------+---
>>>]
Une référence qui ne référence aucune valeur est [c null]. Nous développerons ce point ci-après.
Une référence qui ne référence aucune valeur est [c null]. Nous développerons ce point.
Une telle variable est dans un état quasiment inutile. Comme elle ne référence pas d'objet, elle ne peut pas être utilisée dans un contexte où un objet [c MaClasse] est requis :
Une telle variable est dans un état quasiment inutile. Comme elle ne référence pas d'objet, elle ne peut pas être utilisée dans un contexte où un objet [c MaClasse] est requis~ :
[code=d <<<
@ -45,14 +46,14 @@ Une telle variable est dans un état quasiment inutile. Comme elle ne référenc
}
>>>]
Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser] reçoit. Essayer d'accéder à un membre d'un objet non existant fait planter le programme :
Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser] reçoit. Essayer d'accéder à un membre d'un objet non existant fait planter le programme~ :
[code <<<
$ ./deneme
$ ./essai
$ Erreur de segmentation
>>>]
"Erreur de segmentation" est une indication que le programme a été tué par le système d'exploitation parce qu'il a essayé d'accéder à une adresse mémoire illégale.
«~ Erreur de segmentation~ » est une indication que le programme a été tué par le système d'exploitation parce qu'il a essayé d'accéder à une adresse mémoire illégale.
[ = La valeur [c null]
@ -64,20 +65,20 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
Comme dans beaucoup d'autres langages, la représentation entière de [c null] est 0.
Une variable [c null] peut être utilisée dans deux contextes :
Une variable [c null] peut être utilisée dans deux contextes~ :
# [
En lui affectant un objet
[code=d <<<
variable = new MaClasse; // référence maintenant un objet
>>>]
L'affectation ci-avant fait pointer [c variable] vers l'objet nouvellement créé. À partir de là, [c variable] peut être utilisée pour n'importe quelle opération valide du type [c MaClasse].
Cette affectation fait pointer [c variable] vers l'objet nouvellement créé. À partir de là, [c variable] peut être utilisée pour n'importe quelle opération valide du type [c MaClasse].
]
# [
Déterminer si elle est [c null].
Pour déterminer si elle est [c null].
Cependant, comme l'opérateur [c ==] a besoin de deux objets pour faire la comparaison, l'expression qui suit ne peut pas être compilée :
Cependant, comme l'opérateur [c ==] a besoin de deux objets pour faire la comparaison, l'expression qui suit ne peut pas être compilée~ :
[code=d <<<
if (variable == null) // ERREUR de compilation
@ -90,7 +91,7 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
]
[ = L'opérateur [c is]
Cet opérateur répond à la question "a la valeur nulle ?" (NdT : ''is'' veut dire « est » en anglais)  :
Cet opérateur répond à la question "a la valeur nulle ?" (NdT : ''is'' veut dire «~ est~ » en anglais)~ :
[code=d <<<
if (variable is null) {
@ -98,7 +99,7 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
}
>>>]
L'opérateur [c is] peut aussi être utilisé avec d'autres types de variable. Dans l'utilisation suivante, il compare les valeurs de deux entiers :
L'opérateur [c is] peut aussi être utilisé avec d'autres types de variable. Dans l'utilisation suivante, il compare les valeurs de deux entiers~ :
[code=d <<<
if (vitesse is nouvelleVitesse) {
@ -109,7 +110,7 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
}
>>>]
Lorsqu'on l'utilise avec les tranches, il détermine si deux tranches référencent le même ensemble d'éléments :
Lorsqu'on l'utilise avec les tranches, il détermine si deux tranches référencent le même ensemble d'éléments~ :
[code=d <<<
if (tranche is tranche2) {
@ -119,7 +120,7 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
]
[ = L'opérateur [c !is]
[c !is] est l'opposé de [c is]. Il donne [c true] quand les valeurs sont différentes :
[c !is] est l'opposé de [c is]. Il donne [c true] quand les valeurs sont différentes~ :
[code=d <<<
if (vitesse !is nouvelleVitesse) {
@ -132,16 +133,16 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
Affecter la valeur [c null] à une variable de type référence fait que la variable arrête de référencer son objet actuel.
S'il se trouve que cette affectation supprime la dernière référence à cet objet, alors l'objet devient un candidat à la finalisation par le ramasse-miette. En effet, n'être référencé par aucune variable pour un objet veut dire qu'il n'est pas utilisé du tout dans le programme.
S'il se trouve que cette affectation supprime la dernière référence à cet objet, alors l'objet devient un candidat à la finalisation par le ramasse-miette. En effet, pour un objet, n'être référencé par aucune variable veut dire qu'il n'est pas utilisé du tout dans le programme.
Regardons l'exemple du chapitre précédent où deux variables ont référencé le même objet :
Regardons l'exemple d'[[part:valeur_vs_reference |un chapitre précédent] où deux variables référençaient le même objet~ :
[code=d <<<
auto variable = new MaClasse;
auto variable2 = variable;
>>>]
Ce qui suit est une représentation de l'état de la mémoire après l'exécution de ce code :
Ce qui suit est une représentation de l'état de la mémoire après l'exécution de ce code~ :
[pre <<<
(objet MaClasse anonyme) variable variable2
@ -153,53 +154,53 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
+--------------------+------------+
>>>]
Affecter la valeur [c null] à l'une des deux variable casse sa relation avec l'objet :
Affecter la valeur [c null] à l'une des deux variables casse sa relation avec l'objet~ :
[code=d <<<
variable = null;
>>>]
À partir de ce point, il n'y a plus que [c variable2] qui référence l'objet :
À partir de ce point, il n'y a plus que [c variable2] qui référence l'objet~ :
[pre <<<
(objet MaClasse anonyme) variable variable2
---+-------------------+--- -+------+--- ---+---+---
| ... | | null | | o |
---+-------------------+--- -+---|--+--- ---+-|-+---
▲ |
| |
+----------------------------------+
(objet MaClasse anonyme) variable variable2
---+-------------------+--- ---+------+--- ---+---+---
| ... | | null | | o |
---+-------------------+--- ---+------+--- ---+-|-+---
|
| |
+------------------------------------+
>>>]
Affecter [c null] à la dernière référence rendrait l'objet inatteignable :
Affecter [c null] à la dernière référence rendrait l'objet inatteignable~ :
[code=d <<<
variable2 = null;
>>>]
Un tel objet inatteignable est terminé par le ramasse-miette à un certain moment dans le futur. Du point de vue du programme, l'objet n'existe pas :
Un tel objet inatteignable sera finalisé par le ramasse-miette à un certain moment dans le futur. Du point de vue du programme, l'objet n'existe pas~ :
[pre <<<
variable variable2
---+-------------------+--- ---+----+--- ---+----+---
| | |null| |null|
---+-------------------+--- ---+----+--- ---+----+--
variable variable2
---+-------------------+--- ---+------+--- ---+------+---
| | | null | | null |
---+-------------------+--- ---+------+--- ---+------+---
>>>]
Nous avons discuté des moyens de vider un tableau associatif dans les exercices du [[part:tableaux_associatifs | chapitre sur les tableaux associatifs]. Nous connaissons maintenant une quatrième méthode : affecter [c null] à un tableau associatif cassera la relation entre cette variable et les éléments :
Nous avons discuté des moyens de vider un tableau associatif dans les exercices du [[part:tableaux_associatifs | chapitre sur les tableaux associatifs]. Nous connaissons maintenant une quatrième méthode~ : affecter [c null] à un tableau associatif casse la relation entre cette variable et les éléments~ :
[code=d <<<
string[int] noms;
// ...
noms = null; // ne donne accès à aucun élément
noms = null; // Ne donne accès à aucun élément
>>>]
De manière similaire aux exemples avec [c MaClasse], si [c noms] était la dernière référence aux éléments du tableau associatif, ces éléments seront finalisés par le ramasse-miette.
Les tranches peuvent également être affectées à [c null] :
Les tranches peuvent également être affectées à [c null]~ :
[code=d <<<
int[] tranche = autreTranche[ 10 .. 20 ];
@ -210,9 +211,9 @@ Il n'y a pas d'objet référencé par le paramètre que la fonction [c utiliser]
[ = Résumé
- [c null] est la valeur indiquant qu'une variable ne donne accès à aucun élément.
- Les références qui ont la valeur [c null] ne peuvent être utilisées que dans deux opérations : leur affecter une valeur et déterminer si elle sont [c null] ou pas.
- Les références qui ont la valeur [c null] ne peuvent être utilisées que dans deux opérations~ : leur affecter une valeur et déterminer si elle sont [c null] ou pas.
- Comme l'opérateur [c ==] peut nécessiter l'accès à un objet, déterminer si une variable est [c null] doit être fait avec l'opérateur [c is].
- [c !is] est l'opposé de [c is].
- Affecter [c null] à une variable fait que cette variable ne pointe vers aucun objet.
- Les objets qui ne sont référencés par aucune variable sont finalisées par le ramasse-miette
- Affecter [c null] à une variable fait que cette variable ne pointe plus vers aucun objet.
- Les objets qui ne sont référencés par aucune variable sont finalisés par le ramasse-miette.
]