从方法返回对象时,是创建了新实例还是引用?

dav*_*459 6 .net c# performance

可能重复:
返回引用类型的方法是返回引用还是克隆副本?

我的一位同事表示,当一个方法返回一个像下面这样的对象时,会创建一个新的实例/副本,而不是传回一个引用:

public CustomerEntity Customer { get; set; }

public CustomerEntity GetCustomer() {
    Customer = new CustomerEntity();
    return Customer;    
}
Run Code Online (Sandbox Code Playgroud)

那是对的吗?我的测试似乎表明不是这样,但我不确定如何确认这一点.他担心将数据复制到新对象的开销.

为了更好地衡量,下列哪些方法/场景是新对象创建的?调用类在哪些情况下访问原始对象的引用或副本?假设'CustomerEntity'是一个非常大的对象.

public class CustMan {
public CustomerEntity GetCustomer() {
    Customer = new CustomerEntity();
    return Customer
}

public void FillCustomer(CustomerEntity customer)
{
    customer = new CustomerEntity();
    // Calling class: 
    // CustomerEntity ce = new CustomerEntity(); 
    // l_custMan.FillCustomer(ce);  WriteLine(ce.Name);   
}

public void LoadCustomer()
{
    Customer = new CustomerEntity();
    // Calling Class access customerEntity via l_custMan.CustomerEntity
}
}
Run Code Online (Sandbox Code Playgroud)

澄清:我的同事认为使用"加载"方法比使用"获取"方法更好:

l_custMan.Load();
CustomerEntity = l_custMan.Customer;
Run Code Online (Sandbox Code Playgroud)

CustomerEntity = l_custMan.GetCustomer();
Run Code Online (Sandbox Code Playgroud)

jas*_*son 8

我的一位同事表示,当一个方法返回一个像下面这样的对象时,会创建一个新的实例/副本,而不是传回一个引用:

你的同事不正确*.对于作为引用类型的返回类型,始终会创建一个副本,只是它是所引用的引用的副本.

我可以更明确一点:

假设这ReturnType是一个引用类型并给出

public ReturnType M() {
    // some code
    return E;
}
Run Code Online (Sandbox Code Playgroud)

这里E是评估一个实例表达IReturnType,如果一个副本,你问CI是由并且提及C被返回给调用者,或者如果引用I被返回给调用者.答案是将引用I返回给调用者.

对于传递给方法的引用类型的参数,这是相同的(除非它们用ref或标记out):始终创建副本,它只是传递的引用的副本.

*:在他的辩护中,他可能会对C++的某些知识感到困惑,你必须明确表示你要返回一个参考.