2010-06-17 6 views
2

quand je convertir un objet int pardifférence entre (int) et Convert.ToInt32 dans C#

(int)object 

puis lorsque la valeur de l'objet est 0, alors il me donne erreur acteur spécifique non valide.

quand je convertir un objet int par

convert.toint32(object) 

puis il travaille et donne-moi 0 signifie lancer est valide.

et je veux savoir quelle est la différence entre les deux.

1. (int)object 
2.convert.toint32(object) 

Répondre

1

Il y a plusieurs façons de convertir en int, beaucoup dépend de ce que votre source est. La plus grande chose à garder à l'esprit est la vérification des erreurs, aucune des méthodes n'est une preuve infaillible de leur propre chef et vous devez donc décider comment vous voulez les approcher. Fusionner avec (int), Convertir avec Convert.ToInt32(), Analyser avec int.Parse() tout peut générer des exceptions telles que InvalidCastException, FormatException et OverflowException et utiliser try/catch pour gérer le résultat échoué.

L'analyse avec int.TryParse() retournera un résultat vrai/faux si l'analyse a réussi et si elle aboutit, définissez la valeur sur le paramètre out donné dans l'appel de fonction.

Si vous êtes vraiment essayer de prendre un objet et la transformer en un int, vous êtes probablement mieux avec Convert.ToInt32 tels que:

public void TestFunction(object input) 
    try { 
    int value = Convert.ToInt32(input); 
    SomeOtherFunction(value); 
    } 
    catch (Exception ex) { 
    Console.WriteLine("Could not determine integer value"); 
    } 
} 

Une autre possibilité se fierait sur l'objet la production d'une valeur utilisable dans .ToString() tels que:

public void TestFunction(object input) 
    try { 
    int value = int.Parse(input.ToString()); 
    SomeOtherFunction(value); 
    } 
    catch (Exception ex) { 
    Console.WriteLine("Could not determine integer value"); 
    } 
} 
+0

merci beaucoup ce serait génial. –

12

(int) fonctionne uniquement si l'objet est en fait un entier. Par exemple, (int) "12" vous donnera une exception de distribution invalide.

Convert.ToInt32 Il est préférable de convertir tout ce que vous lui donnez en entier. Donc, Convert.ToInt32("12") renverra 12. Pour être précis, si l'objet implémente IConvertible (ce que System.String fait), alors Convert.ToInt32 appellera la méthode IConvertible.ToInt32.

+0

@ codeka Merci beaucoup –

+1

(int) fonctionnera sur plus qu'un objet qui est un entier. Si vous avez un double par exemple, vous pouvez le convertir en int en utilisant (int) comme: double value1 = 5.5; int valeur2 = (int) valeur1; value2 sera égal à 5. La différence que vous avez signalée est que (int) n'essaiera pas d'analyser une valeur de chaîne en un int. – ManiacZX

3

Les deux méthodes sont complètement différentes. Le premier est casting et le second est conversion.

Conversion est utilisé lorsqu'une valeur non-integer doit être convertie en int.

Casting est utilisé pour unbox l'instance retour à int lorsque l'instance est déjà un type de int boxed dans le type Object.

+0

+1 pour une distinction courte et précise entre deux – Kagawa

2

Il existe deux scénarios où (int) something œuvres:

  1. Le somethingest un entier qui a été emballé dans un objet, et nous utilisons l'appel à unbox il. Voilà ce qui arrive si vous mettez l'int dans un ArrayList, ou HttpSession, etc ...

  2. Le somethingn'est pas un int, mais il est le type peut être converti explicitement en un int, par exemple, court , long, float des types de build-in, ou un type qui a implémenté l'opérateur de distribution explicite.

Convert.ToInt32, d'autre part, appelle simplement IConvertible type de something.méthode ToInt32, et il est plus ou moins équivalent à int.Parse(something)

3

Au sens général, (Type)val peut représenter:

  • une conversion intégré (par exemple, entre un flotteur d'un int), défini par la langue
    • ce qui pourrait nécessiter une opération réelle (float < ===> int est un bon exemple)
    • ou pourrait être juste pour le beefit du compilateur (int < ===> un-int-ENUM, pour exemple)
  • une référence (qui ne change jamais la référence ou l'objet; il seulement les types de la poignée locale à elle)
    • qui pourrait nécessiter un contrôle de type (par exemple, objet ===> IDataReader)
    • mais peut déjà être connu pour être vrai (par exemple, IDataReader === > objet)
  • une opération de boxe/unboxing (qui initialise toujours une valeur de type, ou crée un nouvel objet sur le tas [sauf pour nul boxe un Nullable<T>]
  • un opérateur de conversion défini type (implicite ou explicite), qui exécute tout code défini dans le type

Compte tenu d'une valeur object, la (int)object supposerons est un unboxing opération, donc ne fonctionnera que si l'objet est une boîte int (ou int-ENUM en boîte). Il échouera si la valeur de l'objet est en fait une chaîne ou une boîte-float etc.

Convert.ToInt32 fonctionne différemment; il exécute un certain nombre de tests, pour tenter de rassembler des choses comme lancer-de-un-float (couvert ci-dessus) et analyser une chaîne (qui correspond à int.Parse).

Questions connexes