目錄
C# 的“裝箱”和“拆箱”;
1.裝箱
2.拆箱
使用拆箱操作時出現的錯誤
C# 的“裝箱”和“拆箱”;
C#語言型別系統中有兩個重要的概念,分別是裝箱和拆箱,通過裝箱和拆箱,任何值型別都可以被當作 object 參考型別來看,
1.裝箱
裝箱,實質上就是將之型別轉換為參考型別,
例:
創建一個控制臺應用程式,宣告一個整型變數 i 并賦值為2020,然后將其復制到裝箱物件 obj 中,最后改變變數 i 的值,
using System;
namespace lian__xi
{
class Program
{
static void Main(string[] args)
{
int i = 2020; //宣告一個int型別變數i,并初始化為2020;
object obj = i; //宣告一個object型別的obj,其初始化值為;
Console.WriteLine("1、i的值為{0},裝箱之后的物件為{1}", i, obj);
i = 331; //重新將i賦值為331;
Console.WriteLine("2、i的值為{0},裝箱之后的物件為{1}", i, obj);
Console.ReadLine();
}
}
}
運行結果:
1、i的值為2020,裝箱之后的物件為2020
2、i的值為331,裝箱之后的物件為2020
從程式運行結果可以看出,值型別變數的值復制到裝箱得到的物件中,裝箱后可以改變值型別變數的值,并不會影響裝箱物件的值,
2.拆箱
拆箱,實質上就是將參考型別轉換為值型別的程序,拆箱的執行程序可大致分為以下兩個階段:
- 檢查物件的實體,看他是不是值型別的裝箱值;
- 把這個實體的值復制給值型別的變數,
例:
創建一個控制臺應用程式,宣告一個整型變數 i 并賦值為112,然后將其復制到裝箱物件 obj 中,最后進行拆箱操作將裝箱物件 obj 賦值給整型變數 j ,
using System;
namespace lian__xi
{
class Program
{
static void Main(string[] args)
{
int i = 112; //宣告一個 int 型別的變數 i ,并初始化為 112;
object obj = i; //執行裝箱操作;
Console.WriteLine("裝箱操作:值為{0},裝箱物件為{1}", i, obj);
int j = (int)obj; //執行拆箱操作;
Console.WriteLine("拆箱操作:裝箱物件為{0},值為{1}", obj, j);
Console.ReadLine();
}
}
}
運行結果:
裝箱操作:值為112,裝箱物件為112
拆箱操作:裝箱物件為112,值為112
從程式運行結果可以看出,拆箱后得到的值型別資料的值與裝箱物件相等,
注意:
在執行拆箱操作時,要符合型別一致的原則,否則會出現例外,
使用拆箱操作時出現的錯誤
拆箱是裝箱操作的逆向操作,把參考型別的物件轉換為對應的值型別的值,從記憶體中堆疊分配的角度來說,就是把堆中的物件復制到堆疊中,由于 System.Object 型別也是所有值型別的基類,所以在裝箱的程序中,值型別都可以隱式地轉換為System.Object 型別,并且一般不會存在隱患,但是在拆箱操作時需要特別注意處理不當,則會產生例外,
例:
using System;
namespace stars
{
class Program
{
static void Main(string[] args)
{
Int32 i = 10;
object obj = i;
//省略裝箱操作;
//拆箱操作,易產生隱患;
try
{
Int64 j = (Int64)obj; //拆箱操作
Console.WriteLine("拆箱成功");
}
catch (Exception ex)
{
Console.WriteLine("拆箱失敗!");
Console.WriteLine("拆箱失敗的原因!:{0}", ex.ToString());
}
Console.ReadLine();
}
}
}
運行結果:
拆箱失敗!
拆箱失敗的原因!:System.InvalidCastException: Unable to cast object of type 'System.Object' to type 'System.Int64'.
at stars.Program.Main(String[] args) in H:\VS原始碼\vs練習原始碼\stars\Program.cs:line 18
在上面的代碼中,仔細查看拆箱的代碼,由于Int64型別的取值范圍要比 Int32 型別大的多,所以看起來把Int32 型別的值賦給Int64型別的變數應該不會錯,但運行結果卻出了問題,如上面的運行結果,
從運行結果看到,程式將拋出的一個 InvalidCastException 型別的例外,這個例外的含義是無效型別轉換或顯示轉換引發例外,這就說明該例外是因被拆箱物件的最初型別與拆箱是的值型別不一致而產生的,同時也論證了拆箱市的一條原則,被拆箱物件的最初型別與拆箱是的值型別必須一致,
解決的辦法也很簡單,就是讓拆箱物件的最初型別與拆箱是的型別保持一致,
修改后的關鍵代碼如下:
try
{
Int64 j = (Int64)(Int32)obj;
Console.WriteLine("拆箱成功!");
}
catch (Exception ex)
{
Console.WriteLine("拆箱失敗!");
Console.WriteLine("拆箱失敗的原因:{0}", ex.ToString());
}
嗯這個是博主自己根據《C#自學視頻教程》書中的內容自己總結的,如有不對,請大家留言,博主我會及時改正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/171769.html
標籤:其他
