簡體   English   中英

裝箱int不會將其轉換為引用類型?

[英]boxing an int won't convert it to reference type?

糾正我,如果我錯誤的拳擊轉換值類型為引用類型然后為什么以下代碼給10輸出而不是12?

public static void fun(Object obj)
    {
        obj =12;
    }
    static void Main(string[] args)
    {
        int value =10;
        Object obj = value;
        fun(obj);
        Console.WriteLine((int)obj);
    }

因為當你調用fun時,你實際上並沒有在Main方法中修改obj的值。 該值被賦予fun並在那里改變,因為它本質上是該變量的副本,因為它是通過值而不是通過引用傳遞的。

使用ref關鍵字:

public static void fun(ref Object obj)
{
   obj = 12;
}
static void Main(string[] args)
{
   int value = 10;
   Object obj = value;
   fun(ref obj);
   Console.WriteLine((int)obj);
}

或者讓你的fun方法返回新值:

public static Object fun(Object obj)
{
   obj = 12;
   return obj;
}
static void Main(string[] args)
{
   int value = 10;
   Object obj = value;
   obj = fun(obj);
   Console.WriteLine((int)obj);
}

這與裝箱/拆箱無關。 您只是在方法中創建一個新對象,並用它替換傳遞的參數。 由於你沒有傳遞參數作為ref因此調用代碼不受影響。

將您的方法聲明為

public static void fun(ref Object obj)

並將通話更改為

fun(ref obj);

那么它將輸出12。

.NET函數調用按值傳遞參數,而不是通過引用傳遞(除非使用refout )。 即,只要在函數內部為函數的參數賦值,就不會在函數外部看到更改。 即使對於引用類型,您仍然傳遞引用,但仍然按值傳遞這些引用。

因為您將值作為值類型傳遞給函數。 您應該將對象作為引用類型傳遞。

public static void Main(string[] args)
{
   int value =10;
   Object obj = value;
   fun(ref obj);
   Console.WriteLine((int)obj);
}

public static void fun(ref Object obj)
{
    obj =12;
}

它的值類型或引用類型無關緊要。
將變量傳遞給函數時,將使用變量分配函數中的參數。 他們都指向同一個實例。 但是在函數內部為它分配一個新值,所以它是一個新實例。 前一個當然不會改變。

這與:

object o = 10;
object o2 = o;
o2=12;

o仍然是10,而o2是12

暫無
暫無

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

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