从方法返回对象时,是否创建了新实例或引用
本文关键字:新实例 实例 引用 创建 返回 方法 对象 是否 | 更新日期: 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
的引用。
这与传递到方法中的引用类型的参数相同(除非它们用ref
或out
标记(:总是进行复制,它只是传递的引用的副本。
*:在他的辩护中,他可能被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 ;
}