C#确实改变了返回的类对象改变原始状态?
问题描述:
假设我有下面的类结构:C#确实改变了返回的类对象改变原始状态?
public class spaList
{
private List<customerItemFulfillment> customers;
public customerItemFulfillment addNewCustomer(
string customerNumber, string customerName)
{
customers.Add(new customerItemFulfillment(customerNumber, customerName));
return customers[customers.Count - 1];
//Would running .addItem() on this returned object affect the object in the list?
}
}
public class customerItemFulfillment
{
public string customerNumber { get; }
public string customerName { get; }
public List<itemFulfillment> fulfillmentItems { get; }
public void addItem(string itemNumber, double rebateAmount,
double fulfillmentPercent)
{
fulfillmentItems.Add(new itemFulfillment(itemNumber,
rebateAmount, fulfillmentPercent));
}
public customerItemFulfillment(string customerNumber, string customerName)
{
this.customerNumber = customerNumber;
this.customerName = customerName;
}
}
如果我不喜欢的东西:
spaList spaListings = new SpaList();
customerItemFulfillment newCustomer = spaListings.addNewCustomer(
"customer name", "customer number");
newCustomer.addItem("item number", 25.00, 8.0);
这是否改变customerItemFulfillment
对象spaList.customers
或者是它只是一个该对象的副本?
即。我以后能够做些什么 - spaListings.customers[0].fulfillmentItems[0]
,并且那是我之前添加的项目吗?
答
对象是引用类型。这意味着对象参考是从该方法返回的,而不是该对象的副本。所以,是的,你正在改变原来的项目。如果你这样做,你的客户名单可能会失效。
一种选择是返回对象的副本。最简单的方法是使用ICloneable
的实现克隆类及其属性。
+0
这为什么会导致无效的缓存状态? – Adjit
+0
如果你的缓存假定它永远不会改变,并始终保持原来的项目? –
是的。它会改变它。阅读关于引用类型以及它们如何在C#中传递。另外,你为什么要问,当运行小样本程序会告诉你? – Euphoric
这会让你花更少的时间来运行你已经编写的代码,并找出你自己的代码,而不是你写这个问题。 – Servy
@Servy不是我的电脑,并在git上有代码,并对我的结构感到好奇/它只是感觉不到100%正确 – Adjit