冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 4033|回覆: 2
打印 上一主題 下一主題

[心得] [C#] 型別轉換關鍵字 implicit/explicit

[複製鏈接]

1114

主題

0

好友

1041

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
390967
帖子
2182
主題
1114
精華
0
積分
1041
楓幣
26472
威望
577
存款
10100
贊助金額
1800
推廣
0
GP
3799
閱讀權限
150
在線時間
271 小時
註冊時間
2023-5-18
最後登入
2025-12-15

2023年紀念勳章 太陽勳章 神手勳章 高級客戶 VIP會員 私服達人 懶人勳章 幼兒勳章 音樂勳章 屁孩勳章 貢獻王 性別(女) 性別(男) 積分勳章 發帖達人 2023端午節紀念勳章 富豪勳章 富可敵國 2023中秋節紀念勳章 解說達人 論壇粉絲 2023聖誕節紀念勳章 2024年紀念勳章 2024端午節紀念勳章 2024中秋節紀念勳章 2024聖誕節紀念勳章 2025年紀念勳章 2025端午節紀念勳章 2025中秋節紀念勳章

跳轉到指定樓層
發表於 2023-11-16 16:26:17 |只看該作者 |正序瀏覽
C#中當宣告一個變數類型之後,需要將此變數指派給另一個類型的值就要用到類型轉換
這裡的類型轉換有兩種
1. 隱含轉換/隱式轉換(implicit)
- 使用上不需要特殊語法便可以轉型
- 應用場景是型別轉換不會造成資料失真(或精度損失);比如從整數 int 轉為浮點數 float
2. 明確轉換/顯示轉換(explicit)
- 使用上需要用強制型轉運算式: (T)E → 表示從型別 E 轉成型別 T
- 應用場景是型別轉換會有資料誤差或會因此造成錯誤產生,需額外做處理的情況

型別轉換方法的宣告須具備以下因素
1. 存取修飾詞須是 public
2. 宣告為靜態方法 static
3. 使用關鍵字 implicit 或 explicit
4. 使用運算子宣告關鍵字 operator
5. 定義轉換的型別(以下寫為 Destination)
6. 傳入欲轉換的型別(以下寫為 Source)

具體宣告定義型別轉換方法的語句格式如下
1. 隱含轉換/隱式轉換(implicit)
  1. public static implicit operator Destination(Source src)
  2. {
  3.     return new Destination();
  4. }
複製代碼
2. 明確轉換/顯示轉換(explicit)
  1. public static explicit operator Destination(Source src)
  2. {
  3.     return new Destination();
  4. }
複製代碼
這裡用一個例子實際演練,這三個類別的數字越大模擬表示精度越高的情況
精度低轉高用 implicit,精度高轉低用 explicit
先宣告三個自訂類別,這三個類別結構各自有一個字串屬性跟兩個型別轉換的方法
  1. public class Lv1
  2. {
  3.     private string _Name;
  4.     public string Name
  5.     {
  6.         get { return _Name; }
  7.         set
  8.         {
  9.             _Name = value;
  10.         }
  11.     }

  12.     public Lv1(string LvName)
  13.     {
  14.         this.Name = LvName;
  15.     }

  16.     public static implicit operator Lv2(Lv1 lv1)
  17.     {
  18.         return new Lv2("(隱式轉換至Lv2)" + lv1.Name);
  19.     }
  20.     public static implicit operator Lv3(Lv1 lv1)
  21.     {
  22.         return new Lv3("(隱式轉換至Lv3)" + lv1.Name);
  23.     }
  24. }
  25. public class Lv2
  26. {
  27.     private string _Name;
  28.     public string Name
  29.     {
  30.         get { return _Name; }
  31.         set
  32.         {
  33.             _Name = value;
  34.         }
  35.     }

  36.     public Lv2(string LvName)
  37.     {
  38.         this.Name = LvName;
  39.     }

  40.     public static explicit operator Lv1(Lv2 lv2)
  41.     {
  42.         return new Lv1("(顯式轉換至Lv1)" + lv2.Name);
  43.     }
  44.     public static implicit operator Lv3(Lv2 lv2)
  45.     {
  46.         return new Lv3("(隱式轉換至Lv3)" + lv2.Name);
  47.     }
  48. }
  49. public class Lv3
  50. {
  51.     private string _Name;
  52.     public string Name
  53.     {
  54.         get { return _Name; }
  55.         set
  56.         {
  57.             _Name = value;
  58.         }
  59.     }

  60.     public Lv3(string LvName)
  61.     {
  62.         this.Name = LvName;
  63.     }

  64.     public static explicit operator Lv1(Lv3 lv3)
  65.     {
  66.         return new Lv1("(顯式轉換至Lv1)" + lv3.Name);
  67.     }
  68.     public static explicit operator Lv2(Lv3 lv3)
  69.     {
  70.         return new Lv2("(顯式轉換至Lv2)" + lv3.Name);
  71.     }
  72. }
複製代碼
txtObj1/txtObj2/txtObj3 是 TextBox 輸入控制元件用來給類別的 Name 屬性賦值
txtContent 是 TextBlock 顯示文字控制元件用來顯示資訊
  1. Lv1 L1 = new Lv1(txtObj1.Text);
  2. Lv2 L2 = new Lv2(txtObj2.Text);
  3. Lv3 L3 = new Lv3(txtObj3.Text);

  4. txtContent.Text = "初始狀態:\r\n" +
  5.                           "第一層:" + L1.Name + "\r\n" +
  6.                           "第二層:" + L2.Name + "\r\n" +
  7.                           "第三層:" + L3.Name + "\r\n" ;

  8. Lv1 tmpL1;
  9. Lv2 tmpL2;
  10. Lv3 tmpL3;

  11. txtContent.Text = txtContent.Text + "\r\n";
  12. tmpL2 = L1;
  13. txtContent.Text = txtContent.Text +
  14.                           txtObj1.Text + " 轉 " + txtObj2.Text +
  15.                           "→" + tmpL2.Name + "\r\n";
  16. tmpL3 = L1;
  17. txtContent.Text = txtContent.Text +
  18.                           txtObj1.Text + " 轉 " + txtObj3.Text +
  19.                           "→" + tmpL3.Name + "\r\n";

  20. txtContent.Text = txtContent.Text + "\r\n";
  21. tmpL1 = (Lv1)L2;
  22. txtContent.Text = txtContent.Text +
  23.                           txtObj2.Text + " 轉 " + txtObj1.Text +
  24.                           "→" + tmpL1.Name + "\r\n";
  25. tmpL3 = L2;
  26. txtContent.Text = txtContent.Text +
  27.                           txtObj2.Text + " 轉 " + txtObj3.Text +
  28.                           "→" + tmpL3.Name + "\r\n";

  29. txtContent.Text = txtContent.Text + "\r\n";
  30. tmpL1 = (Lv1)L3;
  31. txtContent.Text = txtContent.Text +
  32.                           txtObj3.Text + " 轉 " + txtObj1.Text +
  33.                           "→" + tmpL1.Name + "\r\n";
  34. tmpL2 = (Lv2)L3;
  35. txtContent.Text = txtContent.Text +
  36.                           txtObj3.Text + " 轉 " + txtObj2.Text +
  37.                           "→" + tmpL2.Name + "\r\n";
複製代碼
執行結果:
Result.png
收藏收藏0 推0 噓0

分享這篇文章



把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$

0

主題

0

好友

0

積分

新手上路

Rank: 1

UID
497934
帖子
18
主題
0
精華
0
積分
0
楓幣
22
威望
0
存款
0
贊助金額
0
推廣
0
GP
0
閱讀權限
10
性別
保密
在線時間
2 小時
註冊時間
2025-11-18
最後登入
2025-12-10
2
發表於 5 天前 |只看該作者
「貨出得去,人進得來,高雄發大財」
[發帖際遇]: odasm 為了響應政府幫企業「做功德」,打工十小時領取工資 1 楓幣 幸運榜 / 衰神榜
點評回覆

使用道具 舉報

1114

主題

0

好友

1041

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
390967
帖子
2182
主題
1114
精華
0
積分
1041
楓幣
26472
威望
577
存款
10100
贊助金額
1800
推廣
0
GP
3799
閱讀權限
150
在線時間
271 小時
註冊時間
2023-5-18
最後登入
2025-12-15

2023年紀念勳章 太陽勳章 神手勳章 高級客戶 VIP會員 私服達人 懶人勳章 幼兒勳章 音樂勳章 屁孩勳章 貢獻王 性別(女) 性別(男) 積分勳章 發帖達人 2023端午節紀念勳章 富豪勳章 富可敵國 2023中秋節紀念勳章 解說達人 論壇粉絲 2023聖誕節紀念勳章 2024年紀念勳章 2024端午節紀念勳章 2024中秋節紀念勳章 2024聖誕節紀念勳章 2025年紀念勳章 2025端午節紀念勳章 2025中秋節紀念勳章

1
發表於 2023-11-16 16:43:21 |只看該作者
再補充一下
當兩個類別互相轉換的方法可以寫在來源類別(Source)內或目標類別(Destination)內
但不能同時存在兩個類別內!
可以嘗試把上面例子 Lv1 內的 public static implicit operator Lv2(Lv1 lv1) 方法剪貼到 Lv2 內依然正確執行
但實務上建議把轉換方法寫在來源類別內維護起來也比較直覺
[發帖際遇]: whitefox 自從加入「鮑料公社」後,去餐廳只要大喊拎杯要爆料吃飯都可以免錢,省下伙食費 1 楓幣 幸運榜 / 衰神榜
點評回覆

使用道具 舉報

高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策詐騙防範及資料調閱

Copyright © 2011-2025 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2025-12-15 22:04

回頂部