0
votes

Tableau nullable et pourquoi avons-nous besoin d'eux

Je vois du code comme celui-ci et je le comprends comme une matrice nullable, mais je ne comprends pas pourquoi en avons-nous besoin, car les matrices sont des types de refait, ils sont donc déjà nullables.

Donc, ma question est de savoir pourquoi avons-nous besoin Ceci? P>

private readonly decimal?[] _amounts = new decimal?[_count];


2 commentaires

On dirait que la confusion principale ici est que ce n'est pas un "éventail nullable de décimales", mais "une gamme régulière de décimales nullables".


Merci, cela l'explique


4 Réponses :


5
votes

la déclarant comme décimal? [] signifie que les éléments que la matrice contient peut être null ou non null . . .

sans le faire nullable , les éléments que la matrice peut stocker ne peut pas être null . .

En d'autres termes, décimal? [] se lit comme "un tableau de nullable décimales". Le ? se réfère aux éléments que la matrice peut contenir et non le tableau lui-même car tous les tableaux sont des types de référence.


0 commentaires

1
votes

Le spécificateur nullable ici concerne non le tableau lui-même, mais au contenu de celui-ci. Comme vous le direz correctement, le tableau en soi est un type de référence, et donc, toujours nulable (au moins jusqu'à ce que c # 8).

Quelques exemples de la différence: P>

decimal[] nonNullable = new decimal[2];
nonNullable[0] = 1;             //OK, a non null item
nonNullable[1] = null;          //Compile error: array doesn't accepts nulls
nonNullable = null;             //OK, set the array reference to null

decimal?[] nullable = new decimal?[2];
nullable[0] = 1;                //OK, a non null item
nullable[1] = null;             //OK, a null item (actually, a Nullable<decimal> instance)
nullable = null;                //OK, set the array reference to null


2 commentaires

Veuillez noter que ma question initie le tableau en tant que nouvelle décimale? [Compte], pas neuf décimales [compte]


@ CD491415 Oui, j'ai noté que. Je mets à la fois pour des raisons de comparaison pour montrer dans quels cas ont un comportement différent, à la fois de votre cas spécifique et d'un composé.



1
votes

Il y a une différence entre l'objet Array lui-même et les éléments du tableau. Lorsque vous utilisez décimal? [] Vous déclarez une matrice dont les éléments sont nullables décimales valeurs. Si vous utilisiez décimal []? (Je ne suis pas sûr que la syntaxe valide, mais juste à des fins d'explication, supposez-y), vous déclareriez une variable pouvant faire référence à un tableau ou peut-être ne fait référence à rien. Le plus tard est le cas inutile que vous décrivez car, comme vous dites (au moins dans les versions plus anciennes de C #) toutes les variables de réseau sont des variables de référence qui peuvent déjà être définies sur null .

Pour clarifier la différence , Considérez le code affiché par Alejandro, ainsi que ce code: xxx

La raison pour laquelle la dernière ligne est ok est due au fait qu'il existe un objet de tableau référencé ici. La seule chose qui est nulle est une partie des valeurs dedans.


0 commentaires

5
votes

Il vaut la peine de mentionner cela de C # 8.0, vous pouvez avoir un type de référence nullable fort>: https://docs.microsoft.com/fr- US / DotNet / Csharp / Tutoriels / Nullables-Types de référence

Mais comme d'autres personnes ont mentionné ceci: p>

private decimal?[]? _amounts;


1 commentaires

Explication géniale. Bart beaucoup apprécié!