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)
我的一位同事表示,当一个方法返回一个像下面这样的对象时,会创建一个新的实例/副本,而不是传回一个引用:
你的同事不正确*.对于作为引用类型的返回类型,始终会创建一个副本,只是它是所引用的引用的副本.
我可以更明确一点:
假设这ReturnType是一个引用类型并给出
public ReturnType M() {
// some code
return E;
}
Run Code Online (Sandbox Code Playgroud)
这里E是评估一个实例表达I的ReturnType,如果一个副本,你问C的I是由并且提及C被返回给调用者,或者如果引用I被返回给调用者.答案是将引用I返回给调用者.
对于传递给方法的引用类型的参数,这是相同的(除非它们用ref或标记out):始终创建副本,它只是传递的引用的副本.
*:在他的辩护中,他可能会对C++的某些知识感到困惑,你必须明确表示你要返回一个参考.
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |