Qual è la ragione dei metodi con valori di ritorno e metodi con void?

0

Voglio capire perché c'è un metodo in C # che potrebbe riaprire un valore, ad esempio:

public int Accelerate()
{
   Speed++;
   return Speed;
}

e un metodo che non restituisce un valore (void)?

Qual è la differenza nel seguente esempio di quello sopra:

public void Accelerate()
{
  Speed++;
  Console.WriteLine(Speed);
}

Vedo che l'ultimo ci salverà un po 'di tempo anziché definire una variabile in cui tenere questo campo quando crei un nuovo oggetto! Sono alle prime armi, quindi qualcuno potrebbe spiegarlo?

    
posta Javi 28.12.2012 - 00:30
fonte

3 risposte

7

Il secondo funziona solo all'interno di un'app basata su console. Si presuppone che si desideri stampare la velocità sullo schermo di una console.

Il primo funzionerà su una console o come parte di un'app Web o come parte di un'app desktop basata sulla GUI o di un'app mobile.

Il primo è quindi più utile come parte di un sistema modulare.

Il secondo sta facendo un calcolo e stampa sullo schermo, mescolando la logica di business con la presentazione, il che è male.

Detto questo, il primo metodo non dovrebbe nemmeno restituire il valore. Dovrebbe esistere un metodo getSpeed() separato per restituire quel valore. Accelerate dovrebbe solo incrementare la velocità.

Anche la variabile dovrebbe essere chiamata speed in minuscolo e il metodo dovrebbe essere chiamato accelerate() anche in minuscolo.

    
risposta data 28.12.2012 - 00:38
fonte
1

Da una prospettiva di programmazione di base reale, in C # se è necessario un metodo per ottenere, derivare, produrre, creare un'istanza o altrimenti comunicare qualcosa al chiamante, si utilizza una funzione con il tipo di ritorno appropriato.

Se hai bisogno di un metodo per fare solo qualcosa e non hai bisogno di nulla da esso, usa un vuoto.

Troppo lungo; Non leggere le informazioni:

Funzioni restituiscono il controllo al chiamante al completamento insieme a un valore o riferimento a un tipo di prodotto; un vuoto è una funzione di caso speciale che non ha prodotto corrispondente ... è una specie del tipo equivalente di null.

Alcune lingue distinguono in modo specifico tra funzioni (metodi che restituiscono un valore) e subroutine (metodi che non restituiscono un valore). Le lingue basate su C usano invece "void" per distinguere tra loro.

In C # in particolare, void è mappato internamente a una struct con alcuni strani comportamenti di compilazione forzata; non puoi davvero usare questo tipo per qualcosa di utile ma se stai facendo riflessioni potresti notarlo e pensare "hrm?":

link

Eric Lippert, fino a poco tempo fa uno dei principali sviluppatori del team di compilatori C #, aveva qualche cosa interessante da dire sul vuoto alcuni anni fa; potrebbe fornire alcune informazioni per te:

link

Si noti che è possibile simulare le funzioni usando i vuoti, tramite i parametri out o ref, ma ciò sarebbe inutilmente prolisso e non oso essere inelegante; le funzioni sono molto più pulite e più facili da leggere e scrivere.

Personalmente, quando uso un vuoto, di solito è per un metodo privato o protetto o per seguire un modello di progettazione. Io tendo a favorire le funzioni per i metodi pubblici; anche se solo per restituire true / false per consentire un ciclo di feedback per i chiamanti o per assistere nel test dell'unità.

    
risposta data 28.12.2012 - 21:31
fonte
0

perché nella maggior parte delle applicazioni vuoi fare qualcosa con la nuova velocità, come trovare la velocità relativa tra 2 oggetti, il tuo codice non c'è modo di ottenere la nuova velocità (a meno che tu non abbia un metodo separato per questo

anche se hai scritto tutto alla console avresti avuto un sacco di spam su di esso, prendi Minecraft che gira a 20 "tick" al secondo con un massimo di cento diverse entità in movimento, con 2000 messaggi di velocità o posizione al secondo nel registro è completamente inutile e scrivendo questo rimarrà in ritardo nel gioco

per un altro punto non è responsabilità del metodo accelerate scrivere le cose alla console

    
risposta data 28.12.2012 - 00:39
fonte

Leggi altre domande sui tag