C#中轉換運算符explicit、implicit與operator研究

来源:https://www.cnblogs.com/zhao123/archive/2019/07/02/11120523.html
-Advertisement-
Play Games

C#中的這個幾個關鍵字:explicit、implicit與operator,估計好多人的用不上,什麼情況,這是什麼?字面解釋:explicit:清楚明白的;易於理解的;(說話)清晰的,明確的;直言的;坦率的;直截了當的;不隱晦的;不含糊的。implicit:含蓄的;不直接言明的;成為一部分的;內含 ...


C#中的這個幾個關鍵字:explicit、implicit與operator,估計好多人的用不上,什麼情況,這是什麼?字面解釋:explicit:清楚明白的;易於理解的;(說話)清晰的,明確的;直言的;坦率的;直截了當的;不隱晦的;不含糊的。implicit:含蓄的;不直接言明的;成為一部分的;內含的;完全的;無疑問的。operator:操作人員;技工;電話員;接線員;(某企業的)經營者,專業公司。說了這麼多,其實explicit和implicit關鍵字分別表示顯式的類型轉換和隱式的類型轉換。

顯式轉換

顯式轉換(強制轉換):必須使用強制運算符,才能執行的轉換,在轉換過程中可能會丟失信息或轉換失敗。
例如

public class BaseAB { }
public class A : BaseAB { }
public class B : BaseAB { }
//測試
double test = 1.234;
int testInt = (int)test;
Console.WriteLine(testInt); //運算結果1,強制轉換數據丟失

try {
    BaseAB ab = new A();
    B b = (B)ab;  //引用強制轉換拋出異常 System.InvalidCastException: Unable to cast object of type 'A' to type 'B'.
} catch (Exception ex) {
    Console.WriteLine(ex.ToString());
}

在值類型強制轉換的時候,會數據丟失,在引用類型做強制轉換的時候會有引發InvalidCastException風險,但是可以通過使用模式匹配安全的進行強制轉換,通過is和as運算符來檢測是否屬於特定類型。
模式匹配:給定一個子串,要求在某個字元串中找出與該子串相同的所有子串。例如:A是字串,BA是待查找的字元串,要求從BA中查找出所有與A相同的字串,這個問題就是模式匹配問題。A是模式,BA是目標。
例如:

var test = 1.1234;
int testInt = test is int ? (int)test : 0;
Console.WriteLine(testInt);
BaseAB ab = new A();
B b = ab as B;
if (b == null) Console.WriteLine("ab 不是 B類型");
//結果:
//0
//ab 不是 B類型

隱式轉換

隱式轉換:這種轉換是類型安全的,不需要特殊處理。
例如:

int i = 123;
double b = i;
Console.WriteLine(b);

A a = new A();
BaseAB baseAB = a;
//結果:
//123

簡單來說就是:小類型轉換成大類型的時候隱式轉換,大類型轉換成小類型用強制轉換。int > float > double >deca

正題

operator 關鍵字用於在類或結構聲明中聲明運算符。運算符聲明可以採用下列四種形式之一:

public static result-type operator unary-operator (type1 param)
public static result-type operator binary-operator (type1 param1, type2 param)
public static implicit operator result-type (type param )
public static explicit operator result-type (type param )

參數說明:
result-type:結果類型
type,type1,type2:參數類型
unary-operator: + - ! ~ ++ — true false
binary-operator: + - * / % & | ^ << >> == != > < >= <=

介紹了這麼多,開始步入正題,講解explicit、implicit與operator。explicit、implicit都是與operator一起操作使用的,operator 關鍵字用於在類或結構聲明中聲明運算符。explicit用於強制轉換,implicit用於隱式轉換。
例如:

public struct MeDecimal
{
    private readonly int intV;
    private readonly double doubleV;

    public MeDecimal(int value):this(value,0)
    {
    }

    public MeDecimal(double value):this(0,value)
    {
    }

    public MeDecimal(int intV, double doubleV)
    {
        this.intV = intV;
        this.doubleV = doubleV;
    }

    public static implicit operator int(MeDecimal meDecimal)
    {
        return meDecimal.intV;
    }

    public static explicit operator double(MeDecimal meDecimal)
    {
        return meDecimal.doubleV;
    }

    public static implicit operator MeDecimal(int meDecimal)
    {
        return new MeDecimal(meDecimal);
    }

    public static explicit operator MeDecimal(double meDecimal)
    {
        return new MeDecimal(meDecimal);
    }

    public static MeDecimal operator ++(MeDecimal meDecimal)
    {
        var t = meDecimal.intV + 1;
        var t2 = meDecimal.doubleV + 1;
        var temp = new MeDecimal(t, t2);
        return temp;
    }

    public override string ToString()
    {
        return $"intV:{intV},doubleV:{doubleV}";
    }
}

用法:

MeDecimal d = (MeDecimal)2.1;
Console.WriteLine($"原始數據:{d}");
d++;
double c = (double)d;
int c2 = d;
Console.WriteLine($"int的值:{c2},double的值:{c}");
Console.WriteLine($"{d}");

//結果:
原始數據:intV:0,doubleV:2.1
int的值:1,double的值:3.1
intV:1,doubleV:3.1

像一些類型需要轉換的地方或者特殊處理的地方,可以用explicit、implicit,方便操作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 8-9 魔術師:創建一個包含魔術師名字的列表,並將其傳遞一個名為show_magicians()的函數,這個函數列印列表中每個魔術師的名字。 8-10 了不起的魔術師:在8-9的程式中,編寫一個名為make_great()的函數,對函數列表進行修改,在每個魔術師的名字中都加入字樣“the Great ...
  • 小猿圈作業: 編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼 tip:account文件的格式 1 dadada 123456 2 da da 3 da1 da 4 da2 1234 5 da3 1111 編寫裝飾器,為多個函數 ...
  • 一、JDBC 1、JDBC簡介 (1) JDBC(Java Database Connectivity),即Java資料庫連接。用於在Java程式中實現資料庫操作功能。 (2)是一種用於執行SQL語句的Java API,使用戶以相同的方式連接不同的資料庫。 (3)JDBC提供一套標準介面,即訪問數據 ...
  • 一、環境: 系統:win7 版本:Python 3.7.2 (32位) 二、問題: 利用Pyinstaller封裝exe 時, 報錯:TypeError: expected str, bytes or os.PathLike object, not NoneType 如下圖: 三、解決方法: 1.這 ...
  • 一直想瞭解python網路爬蟲方面的知識,苦於沒有小白方面的視頻教程,網路基本都是需要有一定基礎才可以學習的 這款由大講師平臺推出的教程,絕對是小白入門的不二之選 首先,這門課程循序漸進。從Python的基本語法函數開始介紹 並且留有獨立的作業,看完視頻教程獨立完成課後作業 鞏固練習 其次,這門課程 ...
  • 1. 自己用的番茄鐘自己做 在PC上我一直使用“小番茄”作為我的番茄鐘軟體,我把它打開後放在副顯示器最大化,這樣不僅可以讓它盡到本分,而且還可以告訴我的同事“我正在專心工作”。可是我總是嫌棄它的手感不夠愉悅,總想自己寫一個番茄鐘軟體,正好最近很久沒寫UWP應用了很手癢,於是就抽空寫了個自用的番茄鐘並 ...
  • 本文包括兩個部分: WebApi中使用swagger 項目打開之後,選擇 引用,右鍵,管理NuGet程式包 瀏覽,搜索swagger,選擇第一個swashbuckle,安裝 安裝好之後,右鍵項目,選擇屬性,生成,在下麵的輸出那裡勾選:XML文檔文件,如果沒有自動填充好路徑,需要自己填寫一下,文件名可 ...
  • ARR是應用級別的負載均衡方案,ARR只能做請求入口的分發服務,而NLB則是伺服器級別的負載均衡方案。我們將二者結合起來,形成高可用最佳方案。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...