2010-06-24 5 views
0

Supposons l'option Strict On; a et b - EntiersCSng() ou x 1F?

Dim mySingle as Single = a/b ' implicit conversion error 

Solution A)

Dim mySingle as Single = CSng(a/b) ' CSng 

Solution B)

Dim mySingle as Single = a * 1F/b ' x 1F 

Quelle solution est préférable?
Quelle solution à prendre si performance est important?

+0

Solution A peut vous jeter hors tension si vous passez jamais à C# (parce que dans C#, 'int/int' retourne un' int') – Powerlord

Répondre

3

Pour intention lisibilité et révélateur, j'aller avec A:

Dim mySingle as Single = CSng(a/b) ' CSng 

A l'aide, vous êtes clairement dire, je sais que le calcul retourne un type différent et c'est ce que je veux. En ce qui concerne les performances - j'ai effectué un micro-test rapide de test 1 million d'itérations pour chacun et la différence était de la milliseconde à la sous-milliseconde, avec un très léger avantage à CSing. Ne vous inquiétez pas des performances pour ce type de conversions (bien sûr, vous devez tester cela par vous-même).

Code de référence:

Sub Main() 
    Dim mySingle As Single 
    Dim a As Integer = 10 
    Dim b As Integer = 5 

    Dim iterations As Integer = 1000000 

    Dim sw As New Stopwatch() 

    sw.Start() 
    For i As Integer = 1 To iterations 
     mySingle = CSng(a/b) ' CSng ' 
    Next 
    sw.Stop() 

    Console.WriteLine(String.Format("CSng(a/b) - {0}", sw.Elapsed)) 


    sw.Reset() 
    sw.Start() 
    For i As Integer = 1 To iterations 
     mySingle = a * 1.0F/b ' x 1F ' 
    Next 
    sw.Stop() 

    Console.WriteLine(String.Format(" a * 1.0F/b - {0}", sw.Elapsed)) 

End Sub 
+0

seulement pour une meilleure lisibilité? Et si la performance est en première place? – serhio

+0

Vous n'avez jamais déclaré que la performance était un problème. Peut-être devriez-vous revoir votre question. – Oded

+0

ok, reflété cela en question. – serhio

Questions connexes