11 votes

Est-ce que null en c# est un type de valeur ou un type de référence ?

A l'origine, j'avais l'impression que NULL était un type de référence parce qu'il était assigné à des références, puis j'ai rencontré ce concept de type de valeur nullable, ce qui a mis ma théorie dans une situation délicate, alors le type de valeur NULL est-il un type de référence sur terre ?

24voto

Eric Lippert Points 300275

La spécification de C# est claire sur ce point : la fonction null représentent un expression qui n'a pas de type . Il n'est ni de type référence, ni de type valeur, ni de type pointeur. Cependant cette expression est convertible à tous ces types. Il n'est pas nécessaire que le compilateur classe toutes les expressions comme ayant un type, et en fait il ne le fait pas.

Vous pourriez alors demander au moment de l'exécution quel est le type d'une référence nulle, quel est le type d'une valeur nulle de type nullable, et quel est le type d'un pointeur nul. Les réponses sont les suivantes :

  • une référence nulle n'a pas de type. Si vous avez une boîte qui peut contenir des chocolats, il est inutile de demander "quelle marque de chocolats se trouve dans cette boîte vide". Un chocolat manquant n'a pas de marque ; une référence nulle n'a pas de type.

  • De même, le type d'un pointeur nul n'est, là encore, rien ; les valeurs des pointeurs nuls ne pointent vers rien. Si vous avez une feuille de papier sur laquelle figure l'adresse 1600 Pennsylvania Avenue, vous pouvez demander "quelle est la couleur de la maison à cette adresse" et obtenir la réponse : blanc. Si vous avez une feuille de papier vierge, demander quelle est la couleur de la maison à cette adresse ne vous donne aucune réponse utile.

  • une valeur nulle d'un type de valeur annulable est une valeur du type de valeur annulable.

9voto

Jason P Points 25760

null n'est pas un type.

De msdn :

Le mot-clé null est un littéral qui représente une référence nulle, c'est-à-dire une référence qui ne renvoie à aucun objet.

Types nuls sont des instances de la Nullable<T> struct qui " Représente un type de valeur qui peut être affecté à null. "

1voto

dahlbyk Points 24897

Ni l'un ni l'autre. null est le default pour les types de référence, mais il n'a pas de type lui-même.

Les types de valeurs nuls sont en fait implémentés comme des types de valeurs eux-mêmes - il y a juste des astuces de compilation et de bibliothèque pour qu'ils se comportent comme prévu lorsqu'ils sont comparés aux types de valeurs suivants null .

1voto

Pac0 Points 7866

null n'a pas de type en soi en C#, comme cela a déjà été dit ici. Je pense que des exemples précis montrant les implications de cette définition manquent dans les autres réponses.

var quelque chose = null ;

n'est pas valide

string a = null; // valid. Null is implicitely casted to string.
int? b = null; // valid. Null is implicitely casted to Nullable<int>.
var c = "hello" // valid, type of c is infered by the compiler by looking at the right side of the expression.

var d = null; // not valid, compiler can't infer any type from null !

La ligne invalide dans l'exemple ci-dessus provoquera l'erreur de compilation suivante :

Erreur - CS0815 - Impossible d'assigner à une variable implicitement typée

et aussi :

Passer null à des méthodes surchargées peut nécessiter un cast explicite.

void myMethod(int? myParam) { }
void myMethod(string myParam) { }

void test 
{
    string a = null;
    myMethod(a); // no problem here, a is of type string so 2nd overload will be used.

    myMethod(null); // not valid ! Compiler can't guess which one you want.

    myMethod((string) null); // valid, null is casted to string so 2nd overload is to be used.
}

La ligne invalide dans l'exemple ci-dessus provoquera l'erreur de compilation suivante :

Erreur - CS0121 - L'appel est ambigu entre les méthodes suivantes ou propriétés suivantes : 'myMethod(string)' et 'myMethod(int ?)'.

0voto

Shang Points 518

Null ne fait pas référence à quoi que ce soit. C'est juste un type qui ne pointe vers rien. On l'utilise généralement pour déréférencer un objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X