Qu’est-ce que le bool? type de retour signifie?

J’ai vu une méthode retourner bool? , est-ce que quelqu’un en sait le sens?

T? est un raccourci de la syntaxe C # vers Nullable . Alors bool? mappe vers Nullable . Donc dans votre cas, c’est une structure qui a la valeur null ou une valeur bool .

Si un Nullable est null c’est un peu différent d’un type de référence étant nul. Il s’agit essentiellement d’une structure contenant le type sous-jacent et un indicateur booléen HasValue . Mais le runtime et le langage C # ont tous deux un peu de magie pour prétendre qu’un Nullable avec HasValue==false est vraiment nul. Mais la différence fuit encore parfois.

Le type sous-jacent est implicitement convertible en type nullable ( bool -> bool? ). Pour obtenir le type sous-jacent du type nullable, vous pouvez soit (bool)myNullableBool explicitement ( (bool)myNullableBool soit utiliser la propriété Value ( myNullableBool.Value ). Vous devez rechercher la valeur null avant, ou vous obtiendrez une exception si la valeur nullable est null .

  • Types nullables (Guide de programmation C #)
  • Nullable

En C #, les types “primitifs” ne peuvent contenir une valeur nulle:

 int blah = null; 

Cela fera une exception car ‘int’ ne peut pas contenir de valeur nulle.

Même avec double, float, bool, DateTime …

C’est bien vraiment. Le problème survient lorsque vous utilisez des bases de données. Dans une firebase database, vous pouvez avoir des lignes qui peuvent être nulles, comme Age (c’est un int).

Comment tenez-vous cette ligne sur un object? Votre int ne peut pas contenir la valeur null et la ligne peut avoir null.

Pour cette raison, MS a créé une nouvelle structure, Nullable, vous pouvez lui atsortingbuer un type “primitif” (ou une structure) pour la rendre nulle comme:

 Nullable blah = null; 

Cela ne fera pas exception, maintenant, cette variable peut contenir un int et un null.

Parce que Nullable est trop long, MS a créé une sorte de pseudonyme: Si vous mettez le ‘?’ après le type, il devient nullable:

 int? blah = null; Nullable blah = null; 

Ces deux lignes sont EXACTEMENT identiques, mais la première est plus facile à lire.

Quelque chose comme ca 🙂

N’importe quel type de valeur (no-nonsense 1 ) avec le suffixe ? en fait un type nullable:

  • int? est un entier Nullable
  • bool? est nullable boolean, ce qui en fait est en fait un booléen à trois états ( true , false et null ) – pensez-y lorsque vous devez implémenter un comportement à trois états.

En d’autres termes object type d’ object ne prend pas en charge la définition nullable en tant object? parce que c’est le type de référence et peut déjà avoir la valeur null .

Utilisation réelle

Les types nullables sont le plus souvent utilisés par rapport à la firebase database, car ils facilitent la transformation de nullable int / bit / date / etc. colonnes aux types CLR. Comme dans cet exemple:

 create table Test ( Id int identity not null primary key, Days int null, ExactDate datetime null, Selected bit null ) 

Cela peut facilement être traduit en POCO:

 public class Test { public int Id { get; set; } public int? Days { get; set; } public DateTime? ExactDate { get; set; } public bool? Selected { get; set; } } 

1 no-nonsense fait référence à tous les types de valeur, à l’exception de Nullable qui est un type de valeur en soi, mais cela n’aurait aucun sens de le rendre à nouveau nullable … Évitez une telle stupidité … Elle ne comstackra pas de toute façon parce que Nullable> i = null; peut être interprété de deux manières:

i.HasValue == false
i.HasValue == true && i.Value.HasValue == false