iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1
Software Development

我要轉職成 C# / .NET 工程師系列 第 18

轉型(上篇)、boxing、unboxing

轉型指的是型別轉換,狹義來說是指string轉int這種轉型,但是幾天的文章下來我們已經知道型別就是類別,正確來說我們要談的是類別與類別間之間轉換,感覺寫不完拆成上下兩篇好了

  1. 父型別與子型別之間轉換
    指基礎類別與衍生類別之間轉換
  2. 非父子型別間轉換
    int轉double、string轉int、classA轉classB等等。

四種轉型提供者

  1. 轉換運算子
  2. 型別內建轉型Parse、TryParse、ToString等
  3. Framework類別庫提供的Convert轉換類別等
  4. 繼承關係轉型

轉換運算子

轉換運算子指兩者沒有繼承關係者可以透過轉換運算子進行轉型,C#原始型別定義好的轉型運算子之外,我們也可以用implicit(隱含)或explicit(明確)實作自訂類別的轉換運算子。例如int、short是各自獨立的型別,
例如:

short s = 123;
int i1 = (int)s; //(明確轉換)
// 又整數型別int長度是4位元組,比整數型別short大兩個位元組,可以使用隱含轉換
int i2 = s; //(隱含轉換)
//但是int長度比short長,若要強制轉成int,需要明確轉換,伴隨而來的風險是數值遺失
short s2 =(short) 123456;

型別內建轉型

字串轉實值型別是很常見的需求,C#的實值型別int、double等都有實作Parse、TryParse方法將字串轉換成數值型別。
int i = int.Parse("123"); //直接轉型,失敗就會出錯。

TryParse會用到out字符把變數地址過去,實際結果是TryParse對直接去變數地址修改,失敗則得0,其餘結果則轉型成功
https://ithelp.ithome.com.tw/upload/images/20191004/20120420Q6U7E7NHIg.png

boxing(裝箱)、unboxing(拆箱)

昨天談到參考型別與實值型別,繼承System.Object的是參考型別,繼承System.ValueType的是實值型別,但是System.ValueType也是繼承自System.Object,所以我們說.net中每個東西都是物件,而像是int與double等實值型別便可以轉換成object,實值型別物件是放在記憶體的stack(堆疊)區,若轉成object成為參考型別物件會放置於記憶體的heap(堆積)區,而這個記憶體操作過程被稱為boxing(裝箱)。相反地,將參考型別物件轉換成實值型別的記憶體操作過程稱為unboxing(拆箱)。


上一篇
實值型別與參考型別
下一篇
轉型(下)-實作轉型運算子、關於繼承關係轉型
系列文
我要轉職成 C# / .NET 工程師34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言