2009-12-12 6 views
0

Parfois, je dois implémenter une interface ou hériter d'un virtual (MustInherit) que la méthode de base attend d'un objet, alors que je sais que la valeur que je vais passer sera toujours un entier, par exemple.Question de performance implicite VB

Quelle devrait être la meilleure performance des exemples ci-dessous:

Public Sub DoSomething(ByVal obj As Object) 
    'option 1: 
    Dim x As Integer = obj 

    'option 2: 
    Dim y = DirectCast(obj, Integer) 
End Function 

Considérations:

  • Option 1: Pas de coulée mais est peut-être pas si bon, ça coûte moins de performance?
  • Option 2: Coulée lorsque le type est connu, mais semble plus sûr.

Note: S'il vous plaît ne pas commenter avec « Pourquoi ne voudriez-vous mettre en œuvre de manière différente », etc., etc. Ma question est comment faire cela, je ne trouve pas un exemple de comment poser la question, ma question est juste quelle option devrait être les droits, et ce qui coûtera plus de performance.

+0

Si vous prétendez implémenter l'interface, alors vous devriez être prêt à accepter n'importe quel objet. Sinon, vous n'implémentez pas vraiment l'interface. –

+0

Encore une fois, j'ai dit que la chose de l'interface était juste une raison pour mettre ma question. – Shimmy

+0

Et un exemple réel est lorsque vous remplacez une classe et que vous le marquez NotInheritable (sealed). Un autre bon exemple est lorsque vous implémentez IValueConversion. – Shimmy

Répondre

1

Votre option 1 est toujours en train de lancer - en fait, c'est plus que cela, c'est effectuer une conversion. Par exemple, si obj est la chaîne "1", l'option 1 la convertira en l'entier 1, tandis que l'option 2 échouera avec une exception InvalidCastException. (Dans le bon vieux temps, cela s'appelait "coercition de type pervers", qui semble beaucoup plus frais que la conversion implicite, mais souligne également le danger potentiel que cette approche puisse dissimuler des erreurs et entraîner un comportement imprévu.)

1 sera probablement légèrement moins performant car il fait un peu plus de travail (conversion par opposition à un plâtre ancien). Mais la différence risque d'être insignifiante si vous ne faites que passer des nombres entiers. Comme toujours, si la performance compte vraiment, mesure.

Probablement une considération plus importante que perf est le comportement souhaité. Par exemple. Si quelqu'un passe dans la chaîne "1", voulez-vous que cela fonctionne comme si vous l'aviez passé dans l'entier 1? Si c'est le cas, optez pour l'option 1. Si vous voulez qu'il échoue dans ce cas, optez pour l'option 2.

+0

Et n'oubliez pas que j'ai tagué ma requête 'implicite', un VB (off the record) n'échouera pas même si vous faites Dim x As Integer = "5", c'est cool (ou pour d'autres personnes - pas cool) chose à propos de VB. – Shimmy

2

Ce que vous faites dans la première option est une distribution implicite. Le compilateur crée un casting explicite pour vous, donc ce que vous obtenez en est encore quelque chose de similaire à:

Dim x As Integer = DirectCast(obj, Integer) 

Vous ne pouvez faire une distribution implicite de l'objet à entier lorsque le mode strict est désactivé. Vous devez activer le mode strict, de sorte que vous soyez sûr de ne pas faire de casting implicite par erreur. Lorsque vous avez activé le mode strict, vous devrez effectuer le cast explicite pour le code à compiler.

+1

La distribution implicite non stricte n'est pas tout à fait la même que DirectCast - elle fait de la coercition de type Evil de type VB6. – itowlson

+0

@itowlson: Bon point. J'ai changé le texte pour qu'il n'implique pas une équivalence exacte. – Guffa