拆箱是將引用類型轉換為值類型 ;反之,裝箱!
利用裝箱和拆箱功能,可通過允許值類型的任何值與Object 類型的值相互轉換,將值類型與引用類型鏈接起來 ;
[csharp]
例如: int val = 100;
object obj = val;
Console.WriteLine (“對象的值 = ",obj);
例如: int val = 100;
object obj = val;
Console.WriteLine (“對象的值 = ",obj);
這是一個裝箱的過程,是將值類型轉換為引用類型的過程
[csharp]
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: ",num);<SPAN style="LINE-HEIGHT: 24px; FONT-FAMILY: arial, 宋體, sans-serif; FONT-SIZE: 14px"> </SPAN>
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: ",num);
這是一個拆箱的過程,是將值類型轉換為引用類型,再由引用類型轉換為值類型的過程
顯然,從原理上可以看出,裝箱時,生成的是全新的引用對象,這會有時間損耗,也就是造成效率降低。看下面代碼
[csharp]
class Program
{
static void Main(string[] args)
{
//// 用時:00:00:01.6070325(跟電腦運行效率有一定關系)
//ArrayList list = new ArrayList();
//Stopwatch watch = new Stopwatch();
//watch.Start();
//for (int i = 0; i < 10000000; i++)
//{
////使用ArrayList集合,每次增加一個數字都會發生裝箱操作。
// list.Add(i);
//}
//watch.Stop();
//Console.WriteLine(watch.Elapsed);
//Console.ReadKey();/
//用時:00:00:00.1402388,使用泛型集合後,省去了裝箱與拆箱操作,性能大大提升。
List<int> list = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
watch.Stop();
Console.WriteLine(watch.Elapsed);
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
//// 用時:00:00:01.6070325(跟電腦運行效率有一定關系)
//ArrayList list = new ArrayList();
//Stopwatch watch = new Stopwatch();
//watch.Start();
//for (int i = 0; i < 10000000; i++)
//{
////使用ArrayList集合,每次增加一個數字都會發生裝箱操作。
// list.Add(i);
//}
//watch.Stop();
//Console.WriteLine(watch.Elapsed);
//Console.ReadKey();/
//用時:00:00:00.1402388,使用泛型集合後,省去了裝箱與拆箱操作,性能大大提升。
List<int> list = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
watch.Stop();
Console.WriteLine(watch.Elapsed);
Console.ReadKey();
}
}
總結:
1.裝箱、拆箱必須是:值類型→引用類型 或 引用類型→值類型。
object,接口。值類型是可以實現接口。
Personp=new Student();//這個叫隱式類型轉換,不叫裝箱。
Studentstu=(Student)p;//這個叫顯示類型轉換,不叫拆箱。
int類型為什麼能裝箱到object類型,但不能裝箱到string類型或Person類型,
因為object類型時int類型的父類。
2.拆箱時,必須用裝箱時的類型來拆箱
裝箱時如果是int,拆箱必須用int,不能用double
3.方法重載時,如果具有該類型的重載,那麼就不叫拆箱或裝箱。
4.字符串連接
[csharp]
string s1 = "a";
string s2 = "b";
int n3 = 10;
double d4 = 99.9;
string result = string.Concat(s1, s2, n3, d4);
string s1 = "a";
string s2 = "b";
int n3 = 10;
double d4 = 99.9;
string result = string.Concat(s1, s2, n3, d4);
[csharp]
<P style="LINE-HEIGHT: 80%; MARGIN-TOP: 2.88pt; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: baseline"><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 8pt"> //string.Concat(s1,s2, n3, d4); </SPAN><SPAN style="FONT-FAMILY: 宋體; FONT-SIZE: 8pt">判斷是否發生了裝箱,及次數。 </SPAN></P>
//string.Concat(s1,s2, n3, d4); 判斷是否發生了裝箱,及次數。 反編譯IL代碼如下圖: