Pourquoi ne puis-je pas utiliser des chaînes de caractères.Contains() si une chaîne par défaut est null?
De Doc MSDN:
public bool Contains(
string value
)
Valeur de retour: vrai si la valeur du paramètre se produit au sein de cette chaîne, ou si valeur est la chaîne vide (""); sinon, faux.
Exception: ArgumentNullException: valeur est null.
Exemple:
string s = string.Empty; //or string s = "";
Console.WriteLine(s.Contains("Hello World!")); //output: False
Si je le modifier:
try
{
string s = null; //or string s;
Console.WriteLine(s.Contains("Hello World!"));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Il va jeter un message d'erreur: Object reference not set to an instance of an object
depuis string
ne pas avoir de valeur par défaut (comme ""
) à partir de Les Valeurs Par Défaut De La Table (Référence C#),
S'il vous plaît revenir à l'exemple, le code ne fonctionnera que si je déclare s
:
string s = "";
Maintenant, Objet s
est définie à une instance d'un objet.
Donc, ma question est: Est-MSDN oublié quelque chose comme: s
ne peut pas être null?
Pour le vérifier, j'ai essayé:
string s = null;
Console.WriteLine(!string.IsNullOrEmpty(s) ? s.Contains("Hello World!") : false);
Il devrait fonctionner.
les appels de méthode ne sont pas admis sur
null
.
OriginalL'auteur Foo | 2015-11-27
Vous devez vous connecter pour publier un commentaire.
Vous avez modifié le valeur avec le instance.
Ici
myString
est le instance sur lequel vous appelez la méthodeContains
, alors queanotherString
est le valeur passé à la méthode. Si cette valeur estnull
la méthode lève uneArgumentNullException
.Lors de la modification de la instance à
null
d'autre part, il a certainement conduit à NRE que vous ne pouvez pas appeler un membre sur un nul de référence. Toutefois, si vous le réglez àstring.empty
Contains
sera de retourfalse
parce que la chaîne vide ne contient pas de rien (en particulierstring.empty
ne contient pas de"Hello World"
, cependant"Hello world"
contient la chaîne de caractères vide).Donc la suivante renvoie
false
:Tout cela renvoie
true
:De toute façon ce que vous voulez à faire est de vérifier si la chaîne vide EST contenue dans aucune autre:
Qui devrait revenir
true
.En outre
myString.Contains(null)
conduit àArgumentNullException
De l'autre côté
null.Contains(aString)
conduit à la loi NRE.OriginalL'auteur HimBromBeere
la nouvelle compilier vous permet de le faire à la condition de vérifier simplifié.
OriginalL'auteur Mike
Cela ressemble à cette question est plus sur la différence entre valeur types (qui ne peut pas être null) et référence types (qui peut être). En C# et d'autres langages à objets, c'est à voir avec la gestion de la mémoire.
La valeur des types énumérés dans votre article MSDN sont tous de taille connue - par exemple
int
sera toujours 32 bits, la taille etc. Sous le capot, ce sont tous desstructs
. Comme ils sont de taille fixe, indépendamment de la valeur, C# stocke sur la la pile des appels. Commenull
, par définition, ne fait pas référence à quoi que ce soit, il n'a pas de taille. Il ne fait pas de sens pour quelque chose qui existe, avec une taille fixe pour exister aussi avec pas de taille.Si vous lisez la documentation pour
string
sur MSDN un peu plus près, vous verrez lestring
est un classe pas une struct. C'est parce qu'une chaîne peut être de n'importe quelle longueur, de sorte qu'il doit être stocké comme un pointeur vers des données sur la tas. Lorsque vous déclarez une variable de type référence, il crée un pointeur sur la pile à un endroit sur le tas, mais il n'y aura rien à cette adresse jusqu'à ce que vous donnez à la variable une valeur. Jusqu'alors, le pointeur de la variable est de pointage et de la mémoire contenant littéralement à rien - c'est à direnull
et ça n'a pas de sens pour essayer de trouver "Hello World!" dans rien. Une chaîne vide est toujours une chaîne de caractères, maisnull
est littéralement rien.C'est sans doute plus de détails que vous attendiez, mais il est bon d'avoir une appréciation des principes sous-jacents d'une langue, même si vous n'en avez pas besoin au jour le jour. Cet article est bien intéressant à lire si vous voulez aller un peu plus en profondeur. L'idée de
null
peut être un drôle de concept pour obtenir autour de votre tête, mais une fois que vous obtenez le coup de lui, il prend tout son sens, honnête!string
est une classe et non un struct. Je suis d'accord avec vous questring
est un type de référence qui est stocké en Tas. Mais sistring
est unclass
, je peux déclarer une propriété pour unestring
, ne puis-je pas? Peut-être que je ne comprends pas, tu veux dire.Il n'est pas explicitement de le dire, mais si vous regardez la syntaxe de string et int, est un
class
et l'autre est unestruct
. Comme pour les propriétés, lastring
classe possède deux propriétés,Length
etChars
, cependant ils sont définis de telle sorte que vous ne pouvez obtenir de leurs valeurs, de ne pas les définir - qui ne serait pas de bon sens!string
etclass
sont 2 objets. Ce n'est pas pourstruct
etint
.struct
etint
sont les types de valeur, pas de types de référence. Vous ne pouvez pas les comparer.OriginalL'auteur Mourndark