Il ciclo For

pubblicato il 30/04/2007

Nel suo sito OdeToCode, Scott Allen ha proposto un quiz interessantissimo di cui proporrò la versione VB.NET 2005 (l'originale qui è in C#, sempre 2005, con rimando al VB).

In poche parole, sia data una classe

Public Class Foo

  Public ReadOnly Property GetUpperLimit() As Integer
    Get
      Console.WriteLine("GetUpperLimit invoked")
      Return 5

    End Get

  End Property

  Public ReadOnly Property GetCollection() As IEnumerable(Of Integer)
    Get
      Console.WriteLine("GetCollection invoked")
      Dim result As New Collections.Generic.List(Of Integer)
      result.Add(1)
      result.Add(2)
      result.Add(3)
      result.Add(4)
      result.Add(5)

      Return result

    End Get

  End Property

End Class

Quindi sia dato un programma che la usa...

Module Module1

  Sub Main()
    Dim foo As New Foo()

    For i As Integer = 1 To foo.GetUpperLimit()
      Console.WriteLine(i)

    Next

    For Each i As Integer In foo.GetCollection()
      Console.WriteLine(i)

    Next

    Console.ReadLine()

  End Sub

End Module

Le domanda che Allen pone sono molto semplici: senza usare un compilatore sareste in grado di dire...

Se andrete al link originale vedrete il mio commento nel quale faccio un figurone... da cioccolataio.

Dal momento che io a quell'Allen lì non son degno neanche di allaciargli le scarpe, non lascerò il quesito senza soluzione:

C#

GetUpperLimit invoked
1
GetUpperLimit invoked
2
GetUpperLimit invoked
3
GetUpperLimit invoked
4
GetUpperLimit invoked
5
GetUpperLimit invoked
GetCollection invoked
1
2
3
4
5

VisualBasic.NET

GetUpperLimit invoked
1
2
3
4
5
GetCollection invoked
1
2
3
4
5

Beh, a parte il mio orgoglio ferito, in realtà questo semplice esercizio ha posto in rilievo una cosa che avevo sempre ignorato: in VisualBasic.NET la GetUpper Limit viene valutata una sola volta prima del ciclo ed il suo risultato viene messo nella cache e riutilizzato ad ogni ciclo, migliorando le performance (soprattutto con cicli molto più numerosi di questo!).