Pourquoi ne pas null false?
Quelle est la raison null
n'est pas évalué à false
dans des conditions?
J'ai d'abord pensé à des affectations pour éviter le bug de l'aide =
au lieu de ==
, mais cela pourrait facilement être rejetée par le compilateur.
if (someClass = someValue) //cannot convert someClass to bool. Ok, nice
if (someClass) //Cannot convert someClass to bool. Why?
if (someClass != null) //More readable?
Je pense que c'est assez raisonnable de supposer que null
signifie false
. Il y a d'autres langues que l'utilisation trop, et je n'ai pas eu un bug à cause de cela.
Edit: Et je suis sûr référence à des types référence.
Un bon commentaire par Daniel Earwicker sur la cession de bug... Cette compile sans un avertissement parce qu'il évalue à bool
:
bool bool1 = false, bool2 = true;
if (bool1 = bool2)
{
//oops... false == true, and bool1 became true...
}
- La réponse est simple: "c'est ainsi Que le C# concepteurs voulaient." Pourtant, ce n'est pas vraiment répondre à la question. Quelqu'un aurait-il aperçu des raisons pour lesquelles la langue, les designers n'aiment pas automatiquement casting des références à des valeurs booléennes (comme le C/C++/Python)?
- Je suis en train de traquer une référence - je crois que j'ai de parler à l'un de la langue équipe a tout à l'arrière, ce qui n'aide pas vraiment
- Je pense que C les programmeurs pense qu'il est raisonnable que, null false. Le faux est une valeur, la valeur null est l'absence de valeur. C# est bon je pense. D'autres langues qui ont été construites sans type booléen ou un concept d'un pointeur (ou type nullable) juste surchargé int dire toutes ces choses différentes. Pourquoi devrait-NULL==faux et faux==0 ? Ils ne devraient pas.
Vous devez vous connecter pour publier un commentaire.
C'est une conception spécifique de la fonctionnalité dans le langage C#:
if
états n'accepter qu'unboolean
.Autant que je me souvienne c'est pour la sécurité: plus spécifiquement, de sorte que votre première
if (someClass = someValue)
ne parvient pas à compiler.Edit: Un des avantages est qu'il permet l'
if (42 == i)
convention ("yoda comparaisons") inutiles.if
états:while ((line = Console.ReadLine()) != null)
if (a = b)
bug n'est pas arrêté par la présente, parce quea
etb
peut être de typebool
."Je pense que c'est assez raisonnable de supposer que, null false"
Pas en C#. le faux est un booléen struct, un type de valeur. Types de valeur ne peut pas avoir une valeur nulle. Si vous vouliez faire ce que vous avez réalisé, vous aurez à créer des convertisseurs de votre type boolean:
Ci-dessus, je pourrais alors faire:
etc.
Debug.Assert(x && !x)
if (status) {}
au lieu deif (status.isSuccess()){}
. Je ne sais pas encore si c'est une bonne idée, mais maintenant j'ai maintenant, je peux le faire."Je pense que c'est assez raisonnable de supposer que, null false"
Je ne suis pas d'accord. À mon humble avis, le plus souvent, false signifie "non". Null signifie "je ne sais pas"; c'est à dire complètement indéterminée.
Une chose qui vient à l'esprit ce sujet dans l'instance d'un type de données, comme les int? Int ne peut pas être null, font-ils toujours évaluer à vrai? On pourrait supposer que int = 0 est faux, mais qui commence à devenir vraiment compliqué, parce que 0 est une valeur valide (où peut-être 0 doit avoir la valeur true parce que le progammer définir), et pas seulement une valeur par défaut.
Il y a beaucoup de cas où la valeur null n'est pas une option, ou parfois, c'est une option, et d'autres fois elle ne l'est pas.
Ils ont mis dans ce genre de choses pour protéger le programmeur de faire des erreurs. Il va le long de la même ligne de pourquoi vous ne pouvez pas le faire tomber en cas de déclarations.
Suffit d'utiliser si(Convertir.ToBoolean(someClass))
http://msdn.microsoft.com/en-us/library/wh2c31dd.aspx
Pour autant que je sais, c'est une fonctionnalité que vous voyez dans la dynamique des langues, que le C# n'est pas (conformément à la spécification du langage
if
accepte uniquementbool
ou une expression qui correspond àbool
).Je ne pense pas que c'est raisonnable de supposer que
null
estfalse
dans chaque cas. Il est logique, dans certains cas, mais pas dans d'autres. Par exemple, supposons que vous avez un drapeau qui peut avoir trois valeurs: ensemble, unset, et de l'onu-initialisé. Dans ce cas, ensemble seraittrue
, unset seraitfalse
et de l'onu-initialisé seraitnull
. Comme vous pouvez le voir, dans ce cas, le sens de l'null
n'est pasfalse
.NULL
(macro) pour0
qui évalue ensuite àfalse
dans leif
déclaration.NULL
. Je parlaisnull
. Je ne vois pas comment ma déclaration d'origine est mauvais. Normalement, vous ne voyezif(someVarThatCouldBeNull)
dans la dynamique des langues.Car nul et faux sont des choses différentes.
Est un exemple parfait bool? foo
Si foo valeur est true, alors que sa valeur est true.
Si foo valeur est false, alors sa valeur est false
Si toto n'a rien d'affecté, sa valeur est null.
Ces trois logiquement conditions distinctes.
Penser d'une autre façon
"Combien d'argent dois-je vous dois?"
"Rien" et "je n'ai pas cette information" sont deux distinctes réponses.
Qui n'est pas la raison. Nous le savons parce que si les deux variables comparées arriver à être de type
bool
puis le code compiler tout à fait heureux:Si
b
est vrai, le message est imprimé (eta
est maintenant vrai, de décisions ultérieures de débogage de l'expérience cohérente avec le message, donc de confondre encore plus...)La raison
null
n'est pas convertible àbool
est tout simplement que C# évite la conversion implicite sauf si requis par le concepteur d'un type défini par l'utilisateur. Le C++ livre d'histoire est pleine d'histoires douloureuses causées par des conversions implicites.Structurellement, la plupart des gens qui "ne peut pas penser à tout technologique raison null doit être égale à false" se tromper.
Code est exécuté par le Cpu.
La plupart (si pas tous) Processeurs ont bits, groupes de bits et interprétations de groupes de bits. Cela dit, quelque chose peut être
0
,1
, unbyte
, unword
, undword
, unqword
et ainsi de suite.Noter que sur plate-forme x86, les octets sont octets (8 bits), et les mots sont habituellement de 16 bits, mais ce n'est pas une nécessité. Les Processeurs plus anciens avaient des mots de 4 bits, et même aujourd'hui' les bas de gamme de contrôleurs embarqués utilisent souvent comme 7 ou 12 bits par mot.
Cela dit, quelque chose est "égal", "zéro", "plus", "moins", "supérieur ou égal", ou "inférieur ou égal" en code machine. Il n'y a pas une telle chose comme
null
,false
outrue
.De la convention,
true
est1
,false
est0
, et unnull
pointeur est soit0x00
,0x0000
,0x00000000
, ou0x0000000000000000
, selon bus d'adresse largeur.C# est une exception, car c'est un type indirect, où les deux valeurs possibles
0
et1
ne sont pas une valeur immédiate, mais une indice d'une structure (pensezenum
en C, ouPTR
en x86 assemblée).C'est par la conception.
Il est important de noter, cependant, que de telles décisions de conception sont élaborer décisions, tandis que le traditionnelle, simple moyen est de supposer que
0
,null
etfalse
sont égaux.C# ne pas faire une conversion du paramètre, comme le C++ n'. Vous avez besoin de convertir explicitement la valeur en une valeur de type boolean si vous souhaitez que le
if
déclaration pour accepter la valeur.C'est tout simplement le type de système de c# par rapport à des langages comme PHP, Perl, etc.
Un état accepte uniquement
Boolean
valeurs, la valeur null n'est pas le type deBoolean
afin de ne pas y travailler.Comme pour les NULS exemple en C/C++ que vous avez mentionné dans un autre commentaire, il faut dire que ni C ni C++ ont un type booléen (afair C++ a généralement un transtypage pour le type bool qui renvoie un int, mais c'est une autre question) et ils n'ont pas non null références, seulement NULL(=> 0)-pointeurs.
Bien sûr, le compilateur concepteurs ont pu mettre en œuvre une conversion automatique pour tout type nullable à booléen mais que serait la cause d'autres problèmes, à savoir:
En supposant que
foo
est pasnull
:Dont l'état de foo est vrai?
Toujours si elle n'est pas nulle?
Mais que faire si vous voulez que votre type convertible pour booléenne (c'est à dire à partir de votre tri-state ou quantique, la logique de la classe)?
Qui signifierait que vous pourriez avoir besoin de deux différentes conversions bool, de l'implicite et de l'explicite, ce qui permettrait à la fois de se comporter différemment.
Je n'osais même pas imaginer ce qui se passerait si vous ne
Je pense que le travail forcé
(foo == null)
est bonne, puisqu'elle ajoute de la clarté à votre code, il est plus facile de comprendre ce que vous avez vraiment vérifier.