web-dev-qa-db-fra.com

Différence entre .ToString et "as string" en C #

Quelle est la différence entre l'utilisation des deux déclarations suivantes? Il me semble que le premier "en tant que chaîne" est un transtypage de type, tandis que le second ToString est un appel réel à une méthode qui convertit l'entrée en chaîne? Je cherche juste un aperçu, le cas échéant.

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
64
jaywon

Si Session["SessionTheme"] N'est pas un string, as string Renverra null.

.ToString() tentera de convertir tout autre type en chaîne en appelant la méthode ToString() de l'objet. Pour la plupart des types intégrés, cela renverra l'objet converti en chaîne, mais pour les types personnalisés sans méthode .ToString() spécifique, il renverra le nom du type de l'objet.

object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

string s = o1 as string;  // returns "somestring"
string s = o1.ToString(); // returns "somestring"
string s = o2 as string;  // returns null
string s = o2.ToString(); // returns "1"
string s = o3 as string;  // returns null
string s = o3.ToString(); // returns "System.Object"
string s = o4 as string;  // returns null
string s = o4.ToString(); // throws NullReferenceException

Une autre chose importante à garder à l'esprit est que si l'objet est null, appeler .ToString() lèvera une exception, mais as string Renverra simplement null.

94
Philippe Leybaert

Le mot clé as vérifiera essentiellement si l'objet is une instance du type, en utilisant l'opcode MSIL isinst sous le capot. S'il l'est, il renvoie la référence à l'objet, sinon une référence nulle.

Il ne pas, comme beaucoup le disent, tente d'effectuer un cast en tant que tel - ce qui implique une sorte de gestion des exceptions. Mais non.

ToString(), appelle simplement la méthode ToString() de l'objet, soit une méthode personnalisée implémentée par la classe (qui pour la plupart des types intégrés effectue une conversion en chaîne) - ou si aucune n'est fournie, le la classe de base object est celle qui renvoie les informations de type.

13
Wim Hollebrandse
Page.Theme = Session["SessionTheme"] as string;

essaie de transtyper en chaîne

tandis que

Page.Theme = Session["SessionTheme"].ToString;

appelle la méthode tostring, qui peut être n'importe quoi vraiment. Cette méthode ne transtype pas, elle doit renvoyer une représentation sous forme de chaîne de cet objet.

5
Oxymoron

Tout d'abord "any-object as string" et "any-object.ToString ()" sont des choses complètement différentes en termes de leur contexte respectif.

string str = any-object as string;

1) Cela transtypera any-object en type de chaîne et si any-object n'est pas transtypable en chaîne, cette instruction renverra null sans lever d'exception.
2) Il s'agit d'un service de compilation.
3) Cela fonctionne à peu près bien pour tout autre type que la chaîne, par exemple: vous pouvez le faire comme n'importe quel objet comme employé, où l'employé est une classe définie dans votre bibliothèque.

string str = any-object.ToString();  

1) Cela appellera ToString () de n'importe quel objet à partir de la définition de type. Étant donné que System.Object définit la méthode ToString (), toute classe du framework .Net dispose de la méthode ToString () disponible pour le remplacement. Le programmeur contournera la ToString () dans la classe ou la définition de structure de n'importe quel objet et écrira le code qui renvoie une représentation de chaîne appropriée de n'importe quel objet en fonction de la responsabilité et du rôle joué par n'importe quel objet.
2) Comme vous pouvez définir une classe Employee et remplacer la méthode ToString () qui peut renvoyer la représentation de la chaîne de l'objet Employee en tant que "FIRSTNAME - LASTNAME, EMP-CDOE".

Notez que le programmeur a le contrôle de ToString () dans ce cas et qu'il n'a rien à voir avec la conversion ou la conversion de type.

4

Pour confondre la question, C # 6.0 a introduit opérateur null-conditionnel . Alors maintenant, cela peut aussi s'écrire:

Page.Theme = Session["SessionTheme"]?.ToString();

Qui renverra soit null, soit le résultat de ToString () sans lever d'exception.

3
Mike Lowery

J'étends un peu la réponse acceptée de Philippe Leybaert parce que même si j'ai trouvé des ressources pour comparer trois d'entre elles, je n'ai jamais trouvé d'explication qui compare les quatre.

  • (string)obj
  • obj as string
  • obj.ToString()
  • Convert.ToString(obj)
object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

Console.WriteLine((string)o1);           // returns "somestring"
Console.WriteLine(o1 as string);         // returns "somestring"
Console.WriteLine(o1.ToString());        // returns "somestring"
Console.WriteLine(Convert.ToString(o1)); // returns "somestring"
Console.WriteLine((string)o2);           // throws System.InvalidCastException
Console.WriteLine(o2 as string);         // returns null
Console.WriteLine(o2.ToString());        // returns "1"
Console.WriteLine(Convert.ToString(o2)); // returns "1"
Console.WriteLine((string)o3);           // throws System.InvalidCastException
Console.WriteLine(o3 as string);         // returns null
Console.WriteLine(o3.ToString());        // returns "System.Object"
Console.WriteLine(Convert.ToString(o3)); // returns "System.Object"
Console.WriteLine((string)o4);           // returns null
Console.WriteLine(o4 as string);         // returns null
Console.WriteLine(o4.ToString());        // throws System.NullReferenceException
Console.WriteLine(Convert.ToString(o4)); // returns ""

A partir de ces résultats, nous pouvons voir que (string)obj Et obj as string Se comportent de la même manière l'un que l'autre lorsque obj est une chaîne ou null; sinon (string)obj lèvera une exception de conversion non valide et obj as string renverra simplement null. obj.ToString() et Convert.ToString(obj) se comportent également de la même façon, sauf lorsque obj est nul, auquel cas obj.ToString() lèvera une exception de référence nulle et Convert.ToString(obj) renverra une chaîne vide.

Voici donc mes recommandations:

  • (string)obj Fonctionne mieux si vous souhaitez lever des exceptions pour les types qui ne peuvent pas être attribués à une variable de chaîne (qui inclut null)
  • obj as string Fonctionne mieux si vous ne voulez pas lever d'exceptions et ne voulez pas non plus de représentations de chaînes de non-chaînes
  • obj.ToString() fonctionne mieux si vous voulez lever des exceptions pour null
  • Convert.ToString(obj) fonctionne mieux si vous ne voulez pas lever d'exceptions et voulez des représentations de chaînes de non-chaînes
1
Kyle Delaney

La vérification as string Est que l'objet est une chaîne. Si ce n'est pas un null, il est retourné.

L'appel à ToString() appellera en effet la méthode ToString() sur l'objet.

1
Oded

La première renvoie la classe sous forme de chaîne si la classe est une chaîne ou dérivée d'une chaîne (renvoie null si elle échoue).

Le second invoque la méthode ToString () sur la classe.

1
rein

En fait, la meilleure façon d'écrire le code ci-dessus est de procéder comme suit:

if (Session["SessionTheme"] != null)
{
    Page.Theme = Session["SessionTheme"].ToString();
}

De cette façon, vous êtes presque certain qu'il ne lancera pas d'exception NullReferenceException.

0
mortenbpost