I've read many times now that "GoTo is bad, outdated, wrong, hazardous, nasty, and should be avoided at all costs", but just can't see what's so wrong with it. Here's a small bit of code I wrote recently, and I don't see what better way than GoTo is there.

VB Code:
  1. Public Function ReadLIGH(ByVal FileHandle As Integer, ByRef NextRecordType As String) As ES_LIGH
  2.  
  3. With ReadLIGH
  4.     Get FileHandle, , .Size
  5.     Get FileHandle, , .UnknownHeader1
  6.     Get FileHandle, , .Flag
  7.     Get FileHandle, , NextRecordType
  8. ReadNext:
  9.     Select Case NextRecordType
  10.     Case "NAME"
  11.         Get FileHandle, , .NAMESize
  12.         .NAMEValue = Space$(.NAMESize - 1)
  13.         Get FileHandle, , .NAMEValue
  14.         Seek FileHandle, Seek(FileHandle) + 1
  15.         Get FileHandle, , NextRecordType
  16.         GoTo ReadNext
  17.     Case "MODL"
  18.         Get FileHandle, , .MODLSize
  19.         .MODLValue = Space$(.MODLSize - 1)
  20.         Get FileHandle, , .MODLValue
  21.         Seek FileHandle, Seek(FileHandle) + 1
  22.         Get FileHandle, , NextRecordType
  23.         GoTo ReadNext
  24.     Case "FNAM"
  25.         Get FileHandle, , .FNAMSize
  26.         .FNAMValue = Space$(.FNAMSize - 1)
  27.         Get FileHandle, , .FNAMValue
  28.         Seek FileHandle, Seek(FileHandle) + 1
  29.         Get FileHandle, , NextRecordType
  30.         GoTo ReadNext
  31.     Case "ITEX"
  32.         Get FileHandle, , .ITEXSize
  33.         .ITEXValue = Space$(.ITEXSize - 1)
  34.         Get FileHandle, , .ITEXValue
  35.         Seek FileHandle, Seek(FileHandle) + 1
  36.         Get FileHandle, , NextRecordType
  37.         GoTo ReadNext
  38.     Case "SCRI"
  39.         Get FileHandle, , .SCRISize
  40.         .SCRIValue = Space$(.SCRISize - 1)
  41.         Get FileHandle, , .SCRIValue
  42.         Seek FileHandle, Seek(FileHandle) + 1
  43.         Get FileHandle, , NextRecordType
  44.         GoTo ReadNext
  45.     Case "SNAM"
  46.         Get FileHandle, , .SNAMSize
  47.         .SNAMValue = Space$(.SNAMSize - 1)
  48.         Get FileHandle, , .SNAMValue
  49.         Seek FileHandle, Seek(FileHandle) + 1
  50.         Get FileHandle, , NextRecordType
  51.         GoTo ReadNext
  52.     Case "LHDT"
  53.         Get FileHandle, , .LHDTSize
  54.         Get FileHandle, , .LHDTWeight
  55.         Get FileHandle, , .LHDTValue
  56.         Get FileHandle, , .LHDTTime
  57.         Get FileHandle, , .LHDTRadius
  58.         Get FileHandle, , .LHDTRed
  59.         Get FileHandle, , .LHDTGreen
  60.         Get FileHandle, , .LHDTBlue
  61.         Seek FileHandle, Seek(FileHandle) + 1
  62.         Get FileHandle, , .LHDTFlags
  63.         Get FileHandle, , NextRecordType
  64.         GoTo ReadNext
  65.     Case "DELE"
  66.         'Record Deleted. Skip the data.
  67.         Seek FileHandle, Seek(FileHandle) + 8
  68.         Get FileHandle, , NextRecordType
  69.         GoTo ReadNext
  70.     End Select
  71. End With
  72.  
  73. End Function