【发布时间】:2015-01-31 02:39:11
【问题描述】:
在一个 C# 程序中,我创建了一个从列表中删除对象的方法。用户输入要删除的项目的索引,然后要求用户确认删除,如果用户确认,则从列表中删除该项目,否则列表保持不变。
我不确定将参数传递给方法的最佳方式。我尝试通过引用传递列表(作为out 参数):
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);
}
}
上面的代码不起作用,因为我收到错误使用未分配的局部变量'customers'和必须在控制离开当前方法之前分配输出参数'customers' 。我在想我可以按值传递列表并返回相同的列表,如下所示:
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);
但这似乎效率不高,因为同一个变量是按值传递然后返回的。
在这种情况下传递参数最有效的方法是什么?
【问题讨论】:
-
List
自动通过引用传递,因此无需返回它。调用方法将看到更改反映在其对传递的 List 的引用中。 -
见:Parameter passing in C# - By Jon Skeet。也试试第二种方法,不返回列表,你会看到它已经改变了。那是因为引用类型的地址是按值传递的。 但重要的是,现在你不应该担心效率,考虑编写更清楚地传达意图的代码,然后再寻找改进性能。
-
第二种方法的返回类型可能是
void。 -
@user469104 哦,对了,我没意识到,谢谢:)
-
@user469104 它传递了一个引用,这与通过引用传递的引用并不完全一样。我明白你在说什么。
标签: c# methods pass-by-reference argument-passing pass-by-value