簡體   English   中英

帶有引用類型變量的對象類型裝箱

[英]Object type boxing with a reference type variable

裝箱是將值類型分配給對象類型時。 將引用類型分配給對象時是否相同?

分配類型(不是對象)后,會發生什么? 那個拳擊也是嗎?

    int num=5;
    object obj = num;  //boxing
    //////////////////////
    MyClass my = new MyClass();
    object obj = my; //what is name this convert  (whethere is boxing?)

裝箱是將值類型分配給對象類型時。

關。 值類型的值 轉換引用類型時, 發生“裝箱”。

將引用類型的值分配給類型對象的變量是否相同?

。將值類型的值轉換為引用類型時會發生裝箱。 將引用類型的值轉換為對象不是裝箱轉換,而是引用轉換。

當引用類型的值(不是對象)被分配給對象類型的變量時,會發生什么?

引用類型的值是reference 將引用分配給類型對象的變量時,將在與該變量關聯的存儲位置中創建引用的副本。

那個拳擊也是嗎?

。將值類型的值轉換為引用類型時會發生裝箱。 將引用類型的值轉換為對象不是裝箱轉換,而是引用轉換。

我想你的意思是

string s = "hello";
object x = s;        // no boxing, just implict conversion to base-type.

之所以System.String ,是因為System.String與所有其他類一樣,都是從System.Object派生的:

public sealed class String : Object { ... }

裝箱法在堆棧上創建一個對象引用,該對象引用在堆上引用例如int類型的值。 但是,當引用類型(女巫不是對象)分配給對象時,它不是裝箱。

埃里克(Eric)的回答與CLI(通用語言基礎結構)標准ECMA-335的分區I(體系結構)的第5章(術語和定義)相對應,其將裝箱定義為:“將具有某種值類型的值轉換為新分配的值引用類型為System.Object的實例。”,並裝箱為:“將類型為System.Object的值(其運行時類型為值類型)轉換為值類型實例。”

CIL(通用中間語言)的裝箱和拆箱指令的行為是這樣的,這也是在C#或VB.NET上下文中談論裝箱/拆箱時通常隱含的含義。

但是,術語裝箱拆箱有時是在更廣泛/務實的意義上使用的。 例如,F# box和unbox運算符可以將值類型引用類型與System.Object之間進行轉換:

> let o = box "Hello World";;
val o : obj = "Hello World"
> let s:string = unbox o;;
val s : string = "Hello World"

將提供的代碼編譯成可運行的可執行文件並將其反匯編,將顯示出第一個賦值( obj )的顯式框指令,而第二個賦值( obj2 )則不存在:

資源

namespace BoxingAndTypeConversion
{
    class Program
    {
        public class MyClass { }

        static void Main(string[] args)
        {
            int num = 5;
            object obj = num;  //boxing
            //////////////////////
            MyClass my = new MyClass();
            object obj2 = my; //what is name this convert  (whethere is boxing?)
        }
    }
}

CIL

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       19 (0x13)
  .maxstack  1
  .locals init ([0] int32 num,
           [1] object obj,
           [2] class BoxingAndTypeConversion.Program/MyClass my,
           [3] object obj2)
  IL_0000:  nop
  IL_0001:  ldc.i4.5
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  box        [mscorlib]System.Int32
  IL_0009:  stloc.1
  IL_000a:  newobj     instance void BoxingAndTypeConversion.Program/MyClass::.ctor()
  IL_000f:  stloc.2
  IL_0010:  ldloc.2
  IL_0011:  stloc.3
  IL_0012:  ret
} // end of method Program::Main

暫無
暫無

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

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