C# 作为参数传递的对象未更新
演讲者 这里我调用了一个名为services.updateSelectedDepository;的方法;。正如您所看到的,它调用了下面服务中的一个方法,该方法调用存储库中的一个方法,以根据DepositID设置存款模型C# 作为参数传递的对象未更新,c#,windows,mvp,C#,Windows,Mvp,演讲者 这里我调用了一个名为services.updateSelectedDepository;的方法;。正如您所看到的,它调用了下面服务中的一个方法,该方法调用存储库中的一个方法,以根据DepositID设置存款模型 public void OnDoubleClicked(object sender, EventArgs e) { if(addTipView.DataGridView.CurrentRow.Index != -1) { deposit.Depo
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();
}
}
服务
存储库
当我在存储库中打印存款金额时,我得到了正确的值,但当我在presenter中打印存款金额时,它不正确。作为参数传递的存款类是通过引用传递的,对吗?为什么我的值在presenter中不正确。将对象传递给松散使用的方法术语时,实际上是在传递引用,但是这里的重要一点是通过值传递对该对象的实际引用。这意味着更新它覆盖它不会在调用链的更高层执行任何操作
如果要覆盖该引用并逐个传递引用,则需要在适当的情况下使用ref关键字
public void GetSelectedDeposit(ref Deposit deposit)
好的,那么当我改变方法中的对象时,它会在堆上创建一个新对象吗?另外,为了帮助我理解,在java中,情况并非如此,对吗?我知道Java将在参数中传递引用的值,但本质上它们将在堆上引用相同的对象。所以这在Java中是可行的。是吗?@asnyder002不必担心堆栈和堆,但是,是的,您将在内存中的不同位置获得一组新的内存,以及该内存的不同引用地址。我不确定java是做什么的,但是我假设它们在工作方式上非常相似,请不要引用我的话。如果您只是在该地址更改对象,即更改属性,那么您不需要ref-its,仅当您尝试为引用分配一个新的引用时,您在本例中是这样的啊,您的最后一句话确实让它为我点击。谢谢你的帮助。
public void GetSelectedDeposit(Deposit deposit)
{
using (var context = new TipManagerDBEntities())
{
deposit = context.Deposits.Where(x => x.DepositID == deposit.DepositID).FirstOrDefault();
Console.WriteLine(deposit.DepositAmount);
}
}
public void GetSelectedDeposit(ref Deposit deposit)