В программе на C# я создал метод, который удаляет объект из списка. Пользователь вводит индекс элемента для удаления, затем пользователю предлагается подтвердить удаление, и элемент удаляется из списка, если пользователь подтверждает, в противном случае список остается неизменным.
Я не уверен насчет наилучшего способа передать аргументы методу. Я попытался пропусканием список по ссылке (как out
параметра):В C# следует передать параметр по значению и вернуть ту же переменную или передать по ссылке?
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);
}
}
Приведенный выше код не работает, как я получаю ошибки Запрещается использование неназначенную локальной переменной 'клиентов и Выездное параметр «клиентов 'должно быть назначено до того, как управление покинет текущий метод. Я думал, что я мог бы передать список по значению и возвращает тот же список, как это:
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);
, но это не кажется эффективным, как та же переменная передается по значению, а затем вернулся.
Каков наиболее эффективный способ передачи аргументов в этом случае?
Список передается по ссылке автоматически, поэтому его не нужно возвращать. Вызывающий метод увидит изменение, отраженное в его ссылке на переданный список. –
user469104
См. [Параметр, проходящий в C# - Джон Скит] (http://www.yoda.arachsys.com/csharp/parameters.html). Также попробуйте второй метод, не возвращая список, вы увидите, что он был изменен. Это связано с тем, что адрес ссылочного типа передается по значению. ** Но важно **, вы не должны беспокоиться об эффективности * сейчас *, подумайте над тем, как писать код, который более четко передает намерение и только позже будет выглядеть для улучшения производительности. – Habib
Второй метод может иметь тип возврата 'void'. –