传递对象作为未更新的参数[重复]
Posted
技术标签:
【中文标题】传递对象作为未更新的参数[重复]【英文标题】:Passed Object as Argument not Being Updated [duplicate] 【发布时间】:2019-11-29 23:37:00 【问题描述】:演示者 这里我调用了一个名为“services.UpdateSelectedDeposit(deposit);”的方法。如您所见,它调用了以下服务中的一个方法,该方法调用了存储库中的一个方法,以根据 DepositID 设置存款模型。
public void OnDoubleClicked(object sender, EventArgs e)
if(addTipView.DataGridView.CurrentRow.Index != -1)
deposit.DepositID = Convert.ToInt32(addTipView.DataGridView.CurrentRow.Cells["DepositID"].Value);
Console.WriteLine(deposit.DepositID);
services.UpdateSelectedDeposit(deposit);
Console.WriteLine(deposit.DepositAmount);
addTipView.TxtTipAmount = deposit.DepositAmount.ToString();
addTipView.TxtDate = deposit.DepoistDate.ToString();
addTipView.TxtHoursWorked = deposit.HoursWorked.ToString();
服务
public void UpdateSelectedDeposit(Deposit deposit)
repo.GetSelectedDeposit(deposit);
存储库
public void GetSelectedDeposit(Deposit deposit)
using (var context = new TipManagerDBEntities())
deposit = context.Deposits.Where(x => x.DepositID == deposit.DepositID).FirstOrDefault();
Console.WriteLine(deposit.DepositAmount);
当我在存储库中打印存款金额时,我得到了正确的值,但是当我在演示者中打印存款金额时,它不正确。我作为参数传递的存款类是通过引用传递的,对吗?为什么我的值在演示者中不正确。
【问题讨论】:
【参考方案1】:当将 object 传递给方法(术语使用松散)时,您实际上是在传递 reference ,但这里的重点是实际的 reference em> 由 value 传递给该对象。意思是更新它(覆盖它)在调用链中没有任何作用。
如果你想覆盖那个reference(通过reference传递reference),那么你需要使用ref
关键字(在适当的情况下)。
public void GetSelectedDeposit(ref Deposit deposit)
【讨论】:
好的,那么当我更改方法中的对象时,它会在堆上创建一个新对象吗?另外,只是为了帮助我理解,在java中,情况并非如此,对吗?我知道 Java 会在参数中传递引用的值,但本质上它们会引用堆上的同一个对象。所以这将在Java中工作。对吗? @asnyder002 不要担心堆栈和堆,但是,是的,您将在内存中的不同位置获得一堆新的内存,以及对该内存的不同引用地址。我不确定 java 做了什么,但是我假设它们的工作方式非常相似(不要引用我的话)。如果您只是更改该地址处的对象,即更改属性,那么您不需要ref
它仅在您尝试为该引用分配一个新引用时,在这种情况下您就是
啊,你的最后一句话真的让我点击了。感谢您的帮助。以上是关于传递对象作为未更新的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
HTTP GET 参数未传递给 Express app.get [重复]
如何在此 onclick 函数中成功传递参数?未捕获的 ReferenceError:未定义 B081517B [重复]