簡體   English   中英

C#修改引用類型對象不會反映更改

[英]C# Modifying Reference Type Objects doesn't reflect changes

我有這個C#代碼:

int i = 20;

object t = i;

object r = t;

r = 100;

為什么此時T的值仍然是20而不是100?

我以為T和R指向相同的位置,對它們中的任何一個的更改都應該相互影響...

我真的不明白引用類型如何在堆中工作,請幫助我

為什么此時T的值仍然是20而不是100?

因為您沒有修改t

您將要查找“ boxing” 但是,您的代碼中發生的事情是存儲在i中的值20被“裝箱”,這意味着分配了新的引用類型對象,並將值20復制到了該對象中。

分配r = t ,會將該裝箱值的引用復制到t 到現在為止還挺好。

但是,當您指定r = 100; ,則您尚未修改框式值。 原始的裝箱值保持不變,但現在僅由t引用。

賦值r = 100會創建一個全新的裝箱值,分配給堆,並將該對象的引用復制到變量r 這對t沒有影響, t仍然設置為第一個裝箱值20的參考。

當將整數值i設置為對象t ,裝箱會發生,並且會將框內的整數值放入Heap中。

當將t設置為r = t時,它們將指向堆上的相同參考地址。 但是,當您使用新的整數值將r設置為r r = 100時,會出現新的裝箱,並且r指向另一個地址。

首先,裝箱和拆箱是非常昂貴的事情。 為什么要嘗試將整數設置為object?

如果要將整數傳遞給某些方法並獲得更改的值,則可以在method參數中使用ref關鍵字。

在下面,您可以找到示例代碼:

    public int GetValue() {
        int i = 20;
        SetNewValue(ref i);
        return i;
    }

    public void SetNewValue(ref int value) {
        value = 100;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM