Esercizio - Restituire valori e parametri dei metodi
- 18 minuti
Nell'unità precedente è stato usato lo scenario del codice relativo al lancio dei dadi per illustrare la differenza tra i metodi con stato (istanza) e senza stato (statico). Lo stesso scenario può essere utile per comprendere altri concetti importanti relativi alla chiamata dei metodi. Per esempio:
- gestione del valore restituito di un metodo.
- parametri del metodo e passaggio di argomenti a un metodo.
- scelta di una versione di overload di un metodo.
Valori restituiti
Alcuni metodi sono progettati per completare la funzione e terminare "silenziosamente". In altri termini, al completamento non restituiscono alcun valore. Sono noti come metodi void.
Altri metodi sono progettati per restituire un valore al completamento. Il valore restituito è in genere il risultato di un'operazione. Un valore restituito è il modo principale in cui un metodo può comunicare con il codice che chiama il metodo.
Si è visto che il metodo Random.Next() restituisce un tipo int contenente il valore del numero generato in modo casuale. Tuttavia, un metodo può essere progettato per restituire qualsiasi tipo di dati, persino un'altra classe. Ad esempio, la classe String include alcuni metodi che restituiscono una stringa, alcuni che restituiscono un intero e alcuni che restituiscono un valore booleano.
Quando si chiama un metodo che restituisce un valore, spesso si assegna il valore restituito a una variabile. In questo modo, è possibile usare il valore in un secondo momento nel codice. Nello scenario dei dadi, il valore restituito Random.Next() è stato assegnato alla variabile roll:
int roll = dice.Next(1, 7);
In alcuni casi, è possibile usare direttamente il valore restituito, senza assegnarlo a una variabile. Ad esempio, è possibile stampare il valore restituito nella console come indicato di seguito:
Console.WriteLine(dice.Next(1, 7));
Anche se un metodo restituisce un valore, è possibile chiamare il metodo senza usare il valore restituito. Ad esempio, è possibile ignorare il valore restituito chiamando il metodo come indicato di seguito:
dice.Next(1, 7);
Tuttavia, ignorare il valore restituito non avrebbe senso. Il motivo per cui si chiama il metodo Next() è per aver la possibilità di recuperare il valore casuale successivo.
Parametri e argomenti del metodo nell'istruzione chiamante
Quando si chiama un metodo, è possibile passare valori che il metodo userà per completare l'attività. Questi valori sono denominati argomenti. Il metodo usa gli argomenti per assegnare valori ai parametri definiti nella firma del metodo. Un metodo può richiedere uno o più parametri per eseguire l'attività prevista, o nessuno.
Annotazioni
Spesso, i termini 'parameter' e 'argument' vengono usati in modo intercambiabile. Tuttavia, 'parametro' fa riferimento alla variabile usata all'interno del metodo. Un 'argomento' è il valore passato quando viene chiamato il metodo.
La maggior parte dei metodi è progettata per accettare uno o più parametri. I parametri possono essere usati per configurare il modo in cui il metodo esegue l'operazione prevista oppure possono essere usati direttamente. Ad esempio, il metodo Random.Next() usa i parametri per configurare i limiti superiore e inferiore del valore restituito. Tuttavia, Console.WriteLine() usa il parametro direttamente stampando il valore nella console.
I metodi usano una firma del metodo per definire il numero di parametri che il metodo accetterà, nonché il tipo di dati di ogni parametro. L'istruzione di codifica che chiama il metodo deve rispettare i requisiti specificati dalla firma del metodo. Alcuni metodi forniscono opzioni per il numero e il tipo di parametri accettati dal metodo.
Quando il chiamante chiama il metodo, specifica valori concreti, chiamati argomenti, per ogni parametro. Gli argomenti devono essere compatibili con il tipo di parametro. Tuttavia, il nome dell'argomento, se usato nel codice chiamante, non deve essere uguale al nome del parametro definito nel metodo.
Osservare il codice seguente:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
La prima riga di codice crea un'istanza della classe Random denominata dice. La seconda riga di codice usa il metodo dice.Next(1, 7) per assegnare un valore casuale a un numero intero denominato roll. Si noti che l'istruzione chiamante fornisce due argomenti separati da un simbolo ,. Il metodo Next() include una firma del metodo che accetta due parametri di tipo int. Questi parametri vengono usati per configurare i limiti inferiori e superiori per il numero casuale restituito. La riga di codice finale usa il metodo Console.WriteLine() per stampare il valore di roll nella console.
Gli argomenti passati a un metodo devono essere dello stesso tipo dei dati dei parametri corrispondenti definiti dal metodo. Se si tenta di passare un argomento tipizzato in modo non corretto a un metodo, il compilatore C# rileva l'errore e forza l'aggiornamento dell'istruzione chiamante prima che il codice venga compilato ed eseguito. Il controllo del tipo è un modo usato da C# e .NET per impedire agli utenti finali di riscontrare errori in fase di esecuzione.
Annotazioni
Anche se i parametri vengono usati spesso, non tutti i metodi richiedono parametri per completare l'attività. Ad esempio, la classe Console include un metodo Console.Clear() che non usa parametri. Poiché questo metodo viene usato per cancellare le informazioni visualizzate nella console, non sono necessari parametri per completare l'attività.
Metodi sovraccaricati
Molti metodi nella libreria di classi .NET hanno firme di metodo di overload. Tra le altre cose, ciò consente di chiamare il metodo con o senza argomenti specificati nell'istruzione chiamante.
Un metodo di overload viene definito con più firme di metodo. I metodi di overload offrono diversi modi per chiamare il metodo o forniscono tipi diversi di dati.
In alcuni casi, vengono usate versioni di overload di un metodo per definire un parametro usando tipi di dati diversi. Il metodo Console.WriteLine(), ad esempio, ha 19 versioni di overload diverse. La maggior parte di questi overload consente al metodo di accettare tipi diversi e quindi scrivere le informazioni specificate nella console. Osservare il codice seguente:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
In questo esempio si richiamano tre versioni di overload distinte del WriteLine() metodo.
- Il primo metodo
WriteLine()usa una firma del metodo che definisce un parametroint. - Il secondo metodo
WriteLine()usa una firma del metodo che definisce i parametri zero. - Il terzo metodo
WriteLine()usa una firma del metodo che definisce un parametrostring.
In altri casi, le versioni di overload di un metodo definiscono un numero diverso di parametri. I parametri alternativi possono essere usati per fornire un maggiore controllo sul risultato desiderato. Ad esempio, il metodo Random.Next() dispone di versioni di overload che consentono di impostare vari livelli di vincolo sul numero generato in modo casuale.
L'esercizio seguente chiama il metodo Random.Next() per generare valori integer casuali con diversi livelli di vincolo:
Assicurarsi che in Visual Studio Code sia aperto un file Program.cs vuoto.
Se necessario, aprire Visual Studio Code, quindi completare la procedura seguente per preparare un file Program.cs nell'editor:
Nel menu File selezionare Apri cartella.
Usare la finestra di dialogo Apri cartella per navigare fino alla cartella CsharpProjects e aprirla.
Nella visualizzazione EXPLORER di Visual Studio Code selezionare Program.cs.
Nel menu Selezione di Visual Studio Code, selezionare Seleziona Tutto e quindi premere il tasto Cancella.
Per esaminare le versioni di overload del metodo
Random.Next(), immettere il codice seguente:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");Scegliere Salva dal menu File di Visual Studio Code.
Nella visualizzazione EXPLORER, per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.
Assicurarsi che il percorso della cartella visualizzato nel prompt dei comandi punti alla cartella contenente il file Program.cs.
Al prompt dei comandi del terminale, per eseguire il codice, digitare dotnet run e quindi premere INVIO.
Si noti che il risultato è simile all'output seguente:
First roll: 342585470 Second roll: 43 Third roll: 89I numeri generati sono casuali, quindi i risultati saranno diversi. Questo esempio è tuttavia una dimostrazione dell'intervallo di risultati che potrebbero essere visualizzati.
Esaminare il codice.
La prima versione del metodo
Next()non imposta un limite superiore e inferiore, quindi il metodo restituirà valori compresi tra0e2,147,483,647, che è il valore massimo che può essere archiviato inint.Poiché la seconda versione del metodo
Next()specifica il valore massimo come limite superiore, in questo caso si può prevedere un valore casuale compreso tra0e100.Poiché la terza versione del metodo
Next()specifica sia il valore minimo che quello massimo, in questo caso si può prevedere un valore casuale compreso tra50e100.Chiudere il pannello Terminale.
In questa unità sono già stati esaminati diversi argomenti. Ecco un breve elenco degli argomenti trattati:
- Si è visto come usare il valore restituito di un metodo (quando il metodo fornisce un valore restituito).
- Si è visto come un metodo può usare i parametri definiti come tipi di dati specifici.
- Sono state esaminate le versioni di overload di alcuni metodi che includono parametri o tipi di parametri diversi.
Utilizza IntelliSense
Visual Studio Code include funzionalità IntelliSense basate su un servizio di linguaggio. Ad esempio, il servizio di linguaggio C# fornisce completamenti del codice intelligenti in base alla semantica del linguaggio e a un'analisi del codice sorgente. In questa sezione si userà IntelliSense per implementare il metodo Random.Next().
Poiché IntelliSense è esposto all'interno dell'editor di codice, è possibile imparare molto su un metodo senza lasciare l'ambiente di scrittura del codice. IntelliSense fornisce suggerimenti e informazioni di riferimento in una finestra popup sotto la posizione del cursore durante la digitazione del codice. Mentre si digita il codice, il contenuto della finestra popup di IntelliSense cambia a seconda del contesto.
Ad esempio, mentre si digita lentamente la parola dice, IntelliSense mostrerà tutte le parole chiave, gli identificatori (o i nomi di variabile nel codice) e le classi C# nella libreria di classi .NET corrispondenti alle lettere inserite. Le funzionalità di completamento automatico dell'editor di codice possono essere usate per completare la parola digitata con la corrispondenza migliore nel popup di IntelliSense. Provalo.
Assicurarsi di avere aperto il file Program.cs in Visual Studio Code.
L'app dovrebbe contenere il codice seguente:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");Nella parte inferiore del file di codice, per sperimentare IntelliSense, immettere lentamente le lettere
d,ie quindic.Si noti la finestra popup di IntelliSense visualizzata quando si inizia a digitare.
Quando compare il popup di IntelliSense verrà visualizzato un elenco di suggerimenti. Dopo aver immesso
dic, l'identificatoredicedovrebbe trovarsi all'inizio dell'elenco.Premere TAB.
Si noti che l'intera parola
diceviene completata nell'editor. È possibile usare i tasti FRECCIA SU e GIÙ per modificare la selezione prima di premere TAB.Annotazioni
Se la finestra di IntelliSense scompare, è possibile premere
backspacee quindi digitare di nuovo l'ultimo simbolo per riaprire IntelliSense.Per specificare l'operatore di accesso ai membri, immettere un carattere
..Si noti che il popup di IntelliSense viene visualizzato di nuovo quando si immette
.e mostra un elenco non filtrato di tutti i metodi (e altri membri della classe) disponibili.Immettere N
L'elenco verrà filtrato e la parola
Nextrisulterà la selezione migliore.Per completare automaticamente l'intera parola, premere TAB.
Per specificare l'operatore di chiamata al metodo, immettere (
Si noterà che la parentesi di chiusura viene aggiunta automaticamente.
L'operatore di chiamata al metodo è il set di parentesi che si trovano a destra del nome del metodo. Questa parte dell'istruzione chiamante è la posizione in cui si specificano gli argomenti che verranno passati al metodo. L'operatore di chiamata al metodo è necessario quando si chiama il metodo.
Si noti che il popup di IntelliSense visualizza ora informazioni dettagliate sul metodo
Random.Next().Soffermarsi qualche istante a esaminare il popup di IntelliSense per il metodo
Random.Next().Annotazioni
Se il popup di IntelliSense è stato chiuso prima di avere la possibilità di esaminarlo, eliminare l'operatore di chiamata
()e quindi immettere ( per visualizzare il popup di IntelliSense.Si noti che la finestra popup include tre sezioni, una a sinistra e due a destra.
Sul lato destro dovrebbe essere visualizzato
int Random.Next()nella sezione superiore eReturns a non-negative random integer.nella sezione inferiore.intdefinisce il tipo restituito per il metodo. In altre parole, quando si esegue questa versione del metodo, verrà restituito un valore di tipoint.Sul lato sinistro del popup di IntelliSense, viene visualizzato
1/3.1/3indica che si sta esaminando la prima delle tre firme del metodo per il metodoNext(). Si noti che questa versione della firma del metodo consente al metodo di funzionare senza parametri (nessun argomento passato al metodo nell'istruzione chiamante).Si noti anche la piccola freccia sopra e sotto
1/3.Per esaminare la seconda versione di overload del metodo, premere il tasto FRECCIA GIÙ sulla tastiera.
Si noti che è possibile usare i tasti FRECCIA SU e GIÙ per spostarsi tra le varie versioni di overload. Sul lato sinistro del popup di IntelliSense verranno visualizzati
1/3,2/3e3/3, con spiegazioni utili a destra.Soffermarsi qualche istante a esaminare ognuna delle versioni di overload per il metodo
Random.Next().La seconda versione di overload del metodo,
2/3, informa che il metodoNext()può accettare un parametroint maxValue. La descrizione indica chemaxValueè il limite superiore esclusivo per il numero che si vuole generare con il metodoNext(). Con esclusivo si intende che il numero restituito sarà minore di maxValue. Quindi, quando si specificadice.Next(1,7);il valore massimo per il lancio dei dadi sarà 6. Si noti che il messaggio nella parte inferiore della sezione è stato aggiornato a:Returns a non-negative random integer that is less than the specified maximum.La terza versione del metodo,
3/3, informa che il metodoNext()può accettare siaint minValuecheint maxValuecome parametri. Il nuovo parametro,minValue, è un limite inferiore per il numero che si vuole generare con il metodoNext(). Poiché il limite inferiore è inclusivo piuttosto che esclusivo, il valore restituito può essere uguale aminValue. Il messaggio nella parte inferiore ora indica:Returns a random integer that is within a specified range.In questo caso, IntelliSense fornisce tutte le informazioni necessarie per selezionare l'overload appropriato, inclusa una spiegazione dettagliata di
maxValueeminValue. Tuttavia, in determinate situazioni potrebbe risultare necessario consultare la documentazione del metodo.
Usare learn.microsoft.com per informazioni sui metodi di overload
Il secondo modo per conoscere le versioni di overload dei metodi consiste nel consultare la documentazione relativa al metodo. La documentazione consentirà anche di comprendere esattamente le finalità di ogni parametro.
Per iniziare, aprire il Web browser preferito e il motore di ricerca.
Eseguire una ricerca di C# Random.Next()
La ricerca deve includere il nome della classe e il nome del metodo. È anche possibile includere il termine
C#per essere certi di non ottenere accidentalmente risultati per altri linguaggi di programmazione.Selezionare il primo risultato della ricerca con un URL che inizia con
https://learn.microsoft.com.Uno dei primi risultati della ricerca dovrebbe permettere di accedere a un URL che inizia con
https://learn.microsoft.com. In questo caso, il titolo del collegamento dovrebbe essereRandom.Next Method.Ecco il collegamento, nel caso in cui non si riesca a trovarlo usando un motore di ricerca:
Aprire il collegamento per C# Random.Next().
Leggere rapidamente la documentazione.
Scorrere verso il basso il contenuto della pagina per visualizzare i vari esempi di codice. Si noti che è possibile eseguire gli esempi nella finestra del browser.
La documentazione di learn.microsoft.com segue un formato standard per ogni classe e metodo nella libreria di classi .NET.
Nella parte superiore della pagina Web individuare la sezione Overload.
Si noti che sono elencate tre versioni di overload del metodo. Ogni versione di overload elencata include un collegamento ipertestuale a una posizione più avanti nella pagina.
Per passare a una descrizione della seconda versione di overload nella stessa pagina, selezionare Next(Int32).
La documentazione per ogni versione del metodo include:
- Una breve descrizione della funzionalità del metodo
- La definizione del metodo
- I parametri accettati dal metodo
- Valori restituiti
- Le eccezioni che possono essere generate
- Alcuni esempi del metodo in uso
- Osservazioni aggiuntive sul metodo
Soffermarsi qualche istante a esaminare la sezione Parametri.
Nella sezione Parametri si può leggere che il parametro
maxValueè il "limite superiore esclusivo del numero casuale da generare". Un limite superiore esclusivo significa che se si desidera che i numeri non siano maggiori di10, è necessario passare il valore11.Nella riga successiva si legge anche: "
maxValuedeve essere maggiore o uguale a 0". Che cosa accade se si ignora questa istruzione? Nella sezione Eccezioni viene spiegato che il metodo restituiràArgumentOutOfRangeExceptionquandomaxValueè minore di 0.Annotazioni
Il contenuto in learn.microsoft.com è la fonte più autorevole per la libreria di classi .NET. È importante leggere la documentazione per comprendere il funzionamento di un determinato metodo.
Riepilogo
- I metodi potrebbero accettare più parametri oppure nessuno, a seconda di come sono stati progettati e implementati. Quando si passano più parametri, è necessario separarli con un simbolo
,. - I metodi potrebbero restituire un valore quando completano l'attività o non restituire nulla (void).
- I metodi di overload supportano diverse implementazioni del metodo, ognuna con una firma del metodo univoca (il numero di parametri e il tipo di dati di ogni parametro).
- IntelliSense consente di scrivere il codice più rapidamente. Fornisce un riferimento rapido ai metodi, i valori restituiti, le versioni di overload e i tipi dei parametri.
- learn.microsoft.com è la fonte più autorevole sul funzionamento dei metodi nella libreria di classi .NET.