Ho una domanda a cui non ho trovato risposta. Diciamo che abbiamo sia in Java o C# il seguente codice:Java ottimizzato per loop VS. Ciclo foreach .NET
class Car {
/* car stuff */
}
E poi in Java
class Truck extends Car {
/* truck stuff */
}
e C#
class Truck : Car {
/* truck stuff again */
}
In C# i seguenti lavori bene:
List<Car> carList = new List<Car>();
//add some objects to the collection
foreach(Truck t in carList)
//do stuff with only the Truck objects in the carList collection
Questo funziona perché Truck è una sottoclasse di Car che in termini semplici significa che ogni autocarro è anche un'auto. Il problema è che il controllo dei tipi è fatto e solo i camion vengono selezionati da carList.
Se cerchiamo la stessa cosa in Java:
List<Car> carList = new ArrayList<Car>();
//add some objects to the collection
for(Truck t : carList)
//**PROBLEM**
A causa del codice all'interno del ciclo maggiore, il codice non sarà nemmeno la compilazione. Invece dobbiamo fare qualcosa di simile per ottenere lo stesso effetto:
for(Car t : carList)
if(t instanceof Car)
//cast t to Truck and do truck stuff with it
E 'la stessa idea, che in C# funziona senza alcun problema, ma in Java è necessario codice aggiuntivo. Anche la sintassi è quasi la stessa! C'è un motivo per cui non funziona in Java?
Anche questo non è così pulito in C# poiché ogni Truck è una macchina, ma non ogni auto è un camion ... In C# la conversione è provato in fase di esecuzione, ma si dovrebbe essere veramente cauto con esso. Java sembra essere più cauto e vuole che il programmatore lo controlli prima (ovviamente la versione C# aggiunge qualche vantaggio se sai cosa stai facendo). –
in C# viene controllato il tipo di ogni oggetto. Se è Truck, viene inserito il corpo del ciclo foreach, altrimenti non lo fa. Cosa non è pulito a riguardo?O lo controllo (Java) o il runtime lo controlla (C#) è lo stesso risultato finale. – alegen
@alegen, non è vero. –