在C#中,我应该按值传递参数并返回相同的变量,还是按引用传递?

问题描述 投票:6回答:3

在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'在控制离开当前方法之前必须将out参数'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);

但是这似乎效率不高,因为同一变量按值传递然后返回。

在这种情况下传递参数的最有效方法是什么?

在C#程序中,我已经建立了一种从列表中删除对象的方法。用户输入要删除的项目的索引,然后要求用户确认删除,然后从...

c# methods pass-by-reference argument-passing pass-by-value
3个回答
4
投票

List像所有引用类型一样,作为reference


2
投票
在C#中,参数按值传递。这意味着,当您将参数传递给方法时,将传递参数的副本。 C#具有按值(如int)和按引用(如任何类)的类型。 C#包含一个堆栈(在推送所有变量时)和一个堆。值类型的值直接在此堆栈中压入,而引用类型的引用在堆栈中压入,引用值在堆中压入。当您传递引用类型(如列表)时,它会创建引用的副本,但是此副本指向列表中的同一对象。因此,任何更改都会直接影响对象,除非您更改引用(使用装配),但这不是您的情况。

0
投票
[[Alexander Leyva Caro]的回答正是我所寻找的!
© www.soinside.com 2019 - 2024. All rights reserved.