[英]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.