传递对象作为未更新的参数[重复]

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 它仅在您尝试为该引用分配一个新引用时,在这种情况下您就是 啊,你的最后一句话真的让我点击了。感谢您的帮助。

以上是关于传递对象作为未更新的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

作为函数参数传递的Java对象[重复]

对象数组传递作为参数,请求对象的实例? [重复]

定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]

HTTP GET 参数未传递给 Express app.get [重复]

如何在此 onclick 函数中成功传递参数?未捕获的 ReferenceError:未定义 B081517B [重复]

将参数作为接口传递[重复]