Casting vs Conversion d’un object en Ssortingng, quand l’object est vraiment une chaîne

Ce n’est pas vraiment un problème, mais je suis curieux. Lorsque je sauvegarde une chaîne dans, disons un DataRow, il est converti en object. Quand je veux l’utiliser, je dois le lancer ToSsortingng. Pour autant que je sache, il existe plusieurs façons de le faire, en premier lieu

ssortingng name = (ssortingng)DataRowObject["name"]; //valid since I know it's a ssortingng 

et un autre est:

 ssortingng name = DataRowObject["name"].ToSsortingng(); 

Je suis intéressé par quelle est la différence entre les deux? Le premier est-il plus efficace? (Ceci est juste une spéculation, dans ma tête, la méthode ToSsortingng () est implémentée par un mécanisme de boucle où le lancer pourrait “être” plus rapide, mais ceci est juste un “instinct” que j’ai).

Y a-t-il même une manière plus rapide / plus élégante de le faire?

Quelqu’un peut-il clarifier cela pour moi?

Les deux sont destinés à des fins différentes. La méthode ToSsortingng de n’importe quel object est supposée renvoyer une représentation de chaîne de cet object. Le casting est très différent, et le mot-clé ‘as’ effectue un cast conditionnel, comme cela a été dit. Le mot clé ‘as’ dit en gros “reçois-moi une référence de ce type à cet object si cet object est de ce type” alors que ToSsortingng dit “reçois-moi une représentation de chaîne de cet object”. Le résultat peut être le même dans certains cas, mais les deux ne devraient jamais être considérés comme interchangeables car, comme je l’ai dit, ils existent à des fins différentes. Si votre intention est de lancer, vous devez toujours utiliser une dissortingbution, NOT ToSsortingng.

de http://www.codeguru.com/forum/showthread.php?t=443873

voir aussi http://bytes.com/groups/net-c/225365-tossortingng-ssortingng-cast

Si vous savez qu’il s’agit d’une Ssortingng vous devez la convertir en une Ssortingng . Lancer votre object sera plus rapide que d’appeler une méthode virtuelle.

Edit: Voici les résultats d’une parsing comparative:

 ============ Casting vs. virtual method ============ cast 29.884 1.00 tos 33.734 1.13 

J’ai utilisé BenchmarkHelper Jon Skeet comme ceci:

 using System; using BenchmarkHelper; class Program { static void Main() { Object input = "Foo"; Ssortingng output = "Foo"; var results = TestSuite.Create("Casting vs. virtual method", input, output) .Add(cast) .Add(tos) .RunTests() .ScaleByBest(ScalingMode.VaryDuration); results.Display(ResultColumns.NameAndDuration | ResultColumns.Score, results.FindBest()); } static Ssortingng cast(Object o) { return (Ssortingng)o; } static Ssortingng tos(Object o) { return o.ToSsortingng(); } } 

Il semble donc que le casting est en fait légèrement plus rapide que l’appel à ToSsortingng() .

Fondamentalement, dans votre cas, il est préférable de laisser le type cast car .ToSsortingng () peut masquer les bogues. Par exemple, votre schéma de firebase database a changé et le nom n’est plus de type chaîne, mais avec .ToSsortingng (), votre code fonctionne toujours. Donc, dans ce cas, il est préférable d’utiliser le type cast.

Voici l’implémentation de Ssortingng.ToSsortingng () – rien de spécial =)

 public override ssortingng ToSsortingng() { return this; } 

Le downcasting est une opération relativement lente car le CLR doit effectuer divers contrôles de type à l’exécution. Cependant, dans ce scénario particulier, la conversion en ssortingng est plus appropriée que l’appel à ToSsortingng() pour des raisons de cohérence (vous ne pouvez pas appeler ToInt32 sur l’ object , mais le ToInt32 en int ) et la maintenabilité.

Je veux faire un autre commentaire

Si vous allez utiliser le casting: nom de la chaîne = (chaîne) DataRowObject [“nom”] vous obtiendrez une exception: Impossible de convertir l’object de type ‘System.DBNull’ pour taper’System.Ssortingng ‘au cas où l’enregistrement la table de firebase database a la valeur NULL.

Dans ce scénario, vous devez utiliser: ssortingng name = DataRowObject [“name”]. ToSsortingng () ou

Vous devez vérifier la valeur nulle comme

 if(!ssortingng.IsNullOrEmpty(DataRowObject["name"].ToSsortingng())) { ssortingng name = (ssortingng)DataRowObject["name"]; } else { //ie Write error to the log file ssortingng error = "The database table has a null value"; } 

Pour l’object de données, je vous suggère d’utiliser le mot clé “as” comme le code suivant.

 ssortingng name = DataRowObject["name"] as ssortingng; 

Veuillez le vérifier avant d’utiliser la valeur.

 if(name != null) { // statement for empty ssortingng or it has value } else { // statement for no data in this object. } 

Dans ce cas:

 ssortingng name = DataRowObject["name"].ToSsortingng(); 

comme c’est une ssortingng , je pense que la méthode ToSsortingng() d’un object ssortingng est simple comme suit:

 return this; 

donc à mon humble avis, il n’y a pas de pénalité de performance.

PS Je suis un programmeur Java, donc cette réponse n’est qu’une supposition.

ToSsortingng () n’effectue pas de conversion par défaut. Son but est de retourner une chaîne qui représente le type (par exemple “System.Object”).

Si vous voulez éviter le casting, vous pouvez essayer de penser à une implémentation qui est fortement typée (en utilisant des génériques, par exemple) et qui évite complètement DataRowObject.

Je sais que vous avez mentionné que l’object est une chaîne, mais si vous craignez que l’object renvoyé soit nul, vous pouvez également utiliser “Convert.ToSsortingng (DataRowObject [” name “]);” Cela a l’avantage supplémentaire de retourner une chaîne vide (ssortingng.empty) si l’object est null, afin d’éviter toute exception de référence null (à moins bien sûr que vous souhaitiez qu’une exception soit lancée dans de tels cas).