In un programma C# ho creato un metodo che elimina un oggetto da un elenco. L'utente inserisce l'indice dell'elemento da eliminare, l'utente viene quindi chiesto di confermare l'eliminazione e l'elemento viene rimosso dall'elenco se l'utente conferma, altrimenti l'elenco rimane lo stesso.
Non sono sicuro del modo migliore per passare argomenti al metodo. Ho provato a passare la lista di riferimento (come parametro out
):In C# devo passare un parametro per valore e restituire la stessa variabile o passare per riferimento?
static void DeleteCustomer(out List<Customer> customers)
{
// ...display list of objects for user to choose from...
int deleteId = ReadInt("Enter ID of customer to delete: ");
Console.Write("Are you sure you want to delete this customer?");
if (Console.ReadLine().ToLower() == "y")
{
customers.RemoveAt(deleteId);
}
}
Il codice di cui sopra non funziona come ricevo gli errori Uso di variabili locali non assegnata 'clienti' e il parametro OUT clienti' 'deve essere assegnato a prima che il controllo lasci il metodo corrente. Stavo pensando che potrei passare la lista per valore e restituire la stessa lista, in questo modo:
static List<Customer> DeleteCustomer(List<Customer> customers)
{
int deleteId = ReadInt("Enter ID of customer to delete: ");
Console.Write("Are you sure you want to delete this customer?");
if (Console.ReadLine().ToLower() == "y")
{
customers.RemoveAt(deleteId);
}
return customers;
}
// ...which would be called from another method with:
List<Customer> customers = DeleteCustomer(customers);
, ma questo non sembra efficiente come la stessa variabile viene passato per valore e poi restituito.
Qual è il modo più efficiente per passare argomenti in questo caso?
L'elenco viene passato automaticamente in base al riferimento, quindi non è necessario restituirlo. Il metodo di chiamata vedrà la modifica riflessa nel suo riferimento alla lista passata. –
user469104
Vedere: [Parametro che passa in C# - Da Jon Skeet] (http://www.yoda.arachsys.com/csharp/parameters.html). Prova anche il secondo metodo, senza restituire l'elenco, vedrai che è stato modificato. Questo perché l'indirizzo del tipo di riferimento è passato per valore. ** Ma soprattutto **, non dovresti preoccuparti dell'efficienza * ora *, prendi in considerazione la scrittura di un codice che trasmetta le intenzioni in modo più chiaro e solo successivamente cerchi di migliorare le prestazioni. – Habib
Il secondo metodo potrebbe avere un tipo di ritorno 'void'. –