Question

Je veux connaître la dactylographie en C # .NET, j'ai en dessous des lignes de code.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

Alors je veux savoir pourquoi string s = i and string s = (string)i ne fonctionne pas et quelle est la différence d'utilisation (string)i, i.ToString(), and Convert.ToString(i).

Était-ce utile?

La solution

En ce qui concerne la boxe et le déballage, les types ont un casting explicite et implicite. Ainsi, dans certaines circonstances, il est assez facile pour que l'exécution permette une conversion implicite entre deux types pris en charge, disons un INT32 à un double. Cependant, il n'y a pas de conversion implicite ou explicite entre un entier et une chaîne, car évidemment, une chaîne n'est pas un entier (malgré le fait qu'une chaîne peut contenir des caractères pour un entier).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

C'est là que Convert vient jouer. Convert Contient un soutien à la tentative de convertir des primitives connues (et des types de soutien IConvertable) à un autre. Alors, ToString ou Convert.ToString Ce serait les méthodes préférées (ToString et Convert.tostring sont pratiquement synonymes, sauf que ToString vous offre quelques options de formatage).

Autres conseils

Bien, string et object - Les deux sont des types de référence. Cependant, object est un type de racine pour tous les types de .NET.

Lorsque vous utilisez une telle syntaxe comme (string)i, vous essayez d'utiliser des types de conversion explicites entre les types. Mais ce type de conversion nécessite string classe pour connaître tous les types d'arguments possibles.

Donc nous avons .ToString() Méthode, qui peut être remplacée dans n'importe quelle classe, et sa valeur de retour est utilisée comme représentation de chaîne de n'importe quel objet.

chaîne s = i et chaîne s = (chaîne) Je ne fonctionne pas

Parce que je ne suis pas une chaîne, et le casting de type est un casting du type, pas une conversion. Cela ne fonctionne que si je contient une chaîne ou une sous-classe de chaîne (ce qui n'est pas possible pour les chaînes, mais peut être pour d'autres classes).

Quelle est la différence d'utilisation (String) i, i.ToString () et convert.toString (i).

  • (String) i: Cast I à une chaîne, doit être attribuable.

  • i.ToString (): appelle la méthode Tosstring, qui est Defiend sur System.Object, ainsi disponible sur toutes les classes et structures - mais ne renvoie aucun contenu sensé s'il n'est pas écrasé.

  • Convert.tostring (i): coonverts i en une chaîne. Cela comprend appeler un convertisseur qui appelle probablement le tostring sur ce rare cas.

À la fin, le casting n'est pas une aconversion. pour (chaîne) je travaille, je dois être une chaîne, tandis que convertir essaie pour en faire une chaîne.

Vous pouvez spécifier des conversions implicites et explicites dans .NET, la raison pour laquelle la chaîne S = I échoue est qu'il n'y a pas d'opération de fonte intégrée pour un entier à une chaîne.

regarde ça Article MSDN sur le casting pour plus d'informations

string s= i Ne fonctionne pas car les types ne correspondent pas, INT ne va pas dans une chaîne.

string s=(string)i ne fonctionne pas car il ne peut pas supprimer quelle conversion de type doit être utilisée (c'est-à-dire quelle base)

quelque chose comme s = ""+i fonctionnerait en revanche car il assumerait la conversion de la base 10.

Alors je veux savoir pourquoi string s = i et string s = (string)i ne marche pas

La réponse courte est qu'il n'y a pas d'IMPLICt (premier exemple ci-dessus) ni explicite (deuxième exemple ci-dessus) coulé de int à la chaîne définie. Réponse légèrement plus longue; Lors de la création de la structure Int32 En C #, aucun comportement de coulée n'a été programmé pour permettre au développeur de couler automatiquement d'un int à une chaîne

Quelle est la différence d'utilisation (string)i, i.ToString(), et Convert.ToString(i)

Eh bien, le premier ne fonctionne pas comme vous l'avez dit, et comme je l'ai expliqué ci-dessus. Le second appelle le ToString Méthode sur la structure Int32, qui renvoie (comme le nom l'indique) une représentation de chaîne de l'objet. Il convient de noter qu'il s'agit d'une toute nouvelle chaîne, qui n'est en aucun cas liée à la valeur d'origine. Le troisième exemple Convert.ToString Will, sous le capot, appellera la façon la plus appropriée de transformer le paramètre transmis en une chaîne - appelle très probablement le ToString Méthode - donc à peu près identique à l'exemple 2.

ToString() La méthode est remplacée par chaque référence qui est la méthode vitale dans la classe d'objets. String CALSS remplace cette méthode et fournit une valeur de chaîne à partir de cela.

L'implémentation par défaut de la méthode TOSTRING renvoie le nom entièrement qualifié du type de l'objet, comme le montre l'exemple suivant.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

Ce comportement est hérité par des types de référence qui ne remplacent pas la méthode de tostring.

La dactylographie en C # ne fonctionne que dans les lignes de l'héritage de classe. L'objet est la racine de tous les types en C # et donc toutes les valeurs peuvent y être dactylographiées.

string et int Ne partagez pas la même branche de l'héritage et ne peut donc pas être directement jetée de l'une à l'autre.

Convert.ToString() est une méthode conçue pour convertir un entier en une chaîne - il n'y a pas de dactylographie en cours, il s'agit simplement d'exécuter une méthode conçue pour convertir un entier en représentation de chaîne.

i.ToString() exécute la fonctionnalité équivalente à Convert.ToString(), excepté i.ToString() a des surcharges qui permettent une plus grande flexibilité sur la représentation du nombre au format de chaîne.

Une dernière note, les exceptions aux règles de dactylographie peuvent être incluses par le développeur en utilisant un public static explicit operator Méthode qui permet au développeur de convertir une valeur à une autre comme cela le semble.

La première chose à noter est que chaque classe dérive de l'objet.

Casting int to Object utilise un INT32.

La chaîne de coulée à l'objet utilise une chaîne.

Il n'y a pas de casting implicite d'un entier à une chaîne car ils sont dans différentes parties de la hiérarchie de classe - on ne se rapporte en aucun cas à une autre. Cependant, car la chaîne est utilisée si souvent pour l'objet de sortie (et donc tous ses enfants) ont une méthode toString () pour la commodité.

Cependant, converti est écrit spécifiquement pour pouvoir convertir d'un type à un autre, par exemple convert.tobool (x) peut analyser "true" ou "false" en booléen, et comme vous l'avez montré, il peut convertir un entier en une chaîne - Encore une fois, c'est vraiment une commodité qui appelle probablement int32.tostring () sous le capot.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top