W programie C# stworzyłem metodę, która usuwa obiekt z listy. Użytkownik wprowadza indeks elementu, który ma zostać usunięty, następnie użytkownik jest proszony o potwierdzenie usunięcia, a pozycja zostaje usunięta z listy, jeśli użytkownik ją potwierdzi, w przeciwnym razie lista pozostanie taka sama.
Nie jestem pewien co do najlepszego sposobu przekazywania argumentów do metody. Próbowałem przechodzącą listy przez odniesienie (jako parametr out
):W języku C# należy przekazać parametr według wartości i zwrócić tę samą zmienną lub przekazać przez odniesienie?
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);
}
}
Powyższy kod nie działa jak dostaję błędy wykorzystania nieprzydzielonej zmiennej lokalnej i Parametr out „klienci 'klientów "musi być przypisany, zanim kontrola opuści bieżącą metodę. Myślałam mogłem przejść przez listę wartości i powrót tej samej listy, jak to:
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);
ale to nie wydaje się skuteczny, jak sama zmienna jest przekazywane przez wartość, a następnie powrócił.
Jaki jest najbardziej skuteczny sposób przekazywania argumentów w tym przypadku?
Lista jest przekazywana automatycznie przez odniesienie, więc nie trzeba jej zwracać. Metoda wywołująca zobaczy zmianę odzwierciedloną w odniesieniu do przekazanej listy. –
user469104
Zobacz: [Parameter passing in C# - autor: Jon Skeet] (http://www.yoda.arachsys.com/csharp/parameters.html). Spróbuj także drugiej metody, bez zwracania listy, zobaczysz, że została zmieniona. Dzieje się tak dlatego, że adres typu referencyjnego jest przekazywany według wartości. ** Ale co ważniejsze **, nie powinieneś martwić się wydajnością * teraz *, rozważ pisanie kodu, który wyraźniej oddaje intencję, a dopiero później poszukaj poprawy wydajności. – Habib
Druga metoda może mieć typ zwrotu "void". –