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

本文关键字:新实例 实例 引用 创建 返回 方法 对象 是否 | 更新日期: 2023-09-27 18:05:19

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

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

public CustomerEntity Customer { get; set; }
public CustomerEntity GetCustomer() {
    Customer = new CustomerEntity();
    return Customer;    
}

这是正确的吗?我的测试似乎表明情况并非如此,但我不确定如何证实这一点。他担心将数据复制到新对象的开销。

为了更好地衡量,在以下哪种方法/场景中创建了新对象?在哪些情况下,调用类会访问对原始对象的引用或对其的副本?假设"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
}
}

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

l_custMan.Load();
CustomerEntity = l_custMan.Customer;

与。

CustomerEntity = l_custMan.GetCustomer();

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

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

您的同事不正确*。对于作为引用类型的返回类型,总是会生成一个副本,只是它是所生成引用的副本。

我可以更明确一点:

假设ReturnType是参考类型并且给定

public ReturnType M() {
    // some code
    return E;
}

其中,E是一个计算结果为ReturnType的实例I的表达式,您询问是否制作了I的副本C并将对C的引用返回给调用方,或者是否将对I的引用返回到调用方。答案是向调用者返回对I的引用。

这与传递到方法中的引用类型的参数相同(除非它们用refout标记(:总是进行复制,它只是传递的引用的副本。

*:在他的辩护中,他可能被C++的一些知识弄糊涂了,在C++中,你必须明确表示你正在返回一个引用。

虽然只返回一个引用,但您的方法似乎很奇怪:

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

这个名称表明它返回一个字段,而不是创建一个新对象,覆盖一个属性,然后返回一个引用,所以这里每次都会创建一个对象

方法可能是这样的:

public CustomerEntity GetCustomer() {
    return Customer;    
}

但这是多余的,因为你的房产已经有了吸气剂。

(我假设CustomerEntity是一个类而不是一个结构,对于结构,会创建一个副本(

您将返回对对象的引用。要创建"新"副本,您需要创建一个全新的实体。

public CustomerEntity GetCustomer() {
    CustomerEntity toReturn = new CustomerEntity();
    return toReturn ;    
}