C#關於操作符重載與轉換

来源:https://www.cnblogs.com/rbzz/archive/2018/08/22/9519310.html
-Advertisement-
Play Games

隨便寫寫 首先,假設我們有一個Person類型 其類型定義如下 在正常情況下,我們讓兩個Person類型相加,是不可能的,例如: 那麼如何能讓兩個Person類型相加,然後返回一個Person類型呢 例如,我想讓名字為"張三"年齡為19的Person加上另一個名字為"李四",年齡為20的Person ...


 隨便寫寫

 

首先,假設我們有一個Person類型

其類型定義如下

  class Person
    {
        public string Name { get; set; } = "Person";
        public int Age { get; set; } = 18;

        public Person() { }

        public Person(string name,int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public Person(string name) : this(name, 18) { }
        public Person(int age) : this("Person", age) { }
        

    }

在正常情況下,我們讓兩個Person類型相加,是不可能的,例如:

那麼如何能讓兩個Person類型相加,然後返回一個Person類型呢

例如,我想讓名字為"張三"年齡為19的Person加上另一個名字為"李四",年齡為20的Person

然後返回一個名字為"張三李四",年齡為39的Person

那麼就需要用到重載"+"號這個操作符了

所以,代碼就如下,在Person中重載

     /// <summary>
        /// 重載+號
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <returns>返回一個Person類型</returns>
        public static Person operator+(Person p1,Person p2)
        {
            //將兩個相加的Person類型分別讓他們的
            //名字和年齡相加後的值賦值給被返回的Person類型
            Person p3 = new Person(p1.Name + p2.Name, p1.Age + p2.Age);
            return p3;
        }

然後我們就可以在Main中來相加兩個Person類型了

看圖

這樣就成功了

然後其它的諸如

 

而關鍵點就在於如果你要重載操作符就必須格式如下

 

白話:public static 返回類型 operator被重載的操作符(本類型,要與之操作的類型)

正文:public static Person operator+(Person p1,Person p2)   => 意思為:我要讓兩個Person類型相加,然後返回一個Person類型

甚至你可以把返回類型改為int,然後兩個Person類型相加後,你返回一個int類型的數據回去

例如返回  p1.Age+p2.Age  這樣,在將兩個Person類型相加之後,將得到一個int類型的數據,其值就是相加的兩個Person類型的Age值的相加值

 

還有個要註意的是,

如果你重載了 == 操作符,就必須要重載 != 因為它們是成對,還有其它成對運算符

而且重載了 == 後,還應該重載 Equals,以及GetHashCode

 

===========================================================================================================

 

下麵再說說轉換操作符

還是說上面的那個Person吧

例如,我非要讓

Person p=30;

正常情況下,是不可能的,但如果我這樣在Person中寫就行了

 public static implicit operator Person(int age)
        {
            return new Person(age);
        }

格式的話,就是固定死的,implicit關鍵字,如果沒記錯的話就是代表可以隱式轉換

還有個顯示轉換的,我忘了,不好意思,懶得查資料了

這一段代碼的意思就是

我要讓一個Person類型的數據,能夠給它一個int類型的值

例如

 

=============================================================================================

後記:寫得比較少,只揀了兩個例子去隨便說了下,其實自己感覺就這兩個例子就夠了

其它的自己多嘗試,語法格式都是固定死了的,怎麼寫就看自己的思想有多麼天馬行空了

好了,最後我們來利用剛纔說的東西,去解決一下下麵這道題

怎麼讓 

a==1 && a==2 && a==3 =true

怎麼做呢,看我們來調皮一下吧

 

首先,我們不管a是什麼類型,反正不太可能是int類型,因為不管原始a等於多少,上述表達式似乎都不為true

那麼我們自己來建個類型為Rational

我們要做的就一件事

為Rational重載 == 操作符

讓它不管與什麼int類型的數字比較都返回true  (夠調皮吧)

看代碼吧:

class Rational
    {
        public int Val { get; set; } = 0;

        public Rational()
        {

        }

        public Rational(int val)
        {
            this.Val = val;
        }
        
        /// <summary>
        /// 我們重載了==操作符
        /// </summary>
        /// <param name="r"></param>
        /// <param name="val"></param>
        /// <returns></returns>
        public static bool operator==(Rational r,int val)
        {
            //只返回一個true是為了讓所有與Rational類型相比對的int類型
            //都返回true
            //因為重載了==,所以必須重載!=
            //其實還應該重載Equals,以及GetHashCode
            //因為它們都是判斷相等的類型
            
            return true;
        }

        public static bool operator !=(Rational r, int val)
        {
            return true;
        }
        
    }

 

然後在Main中試試吧

 static void Main(string[] args)
        {
            Rational a = new Rational();
            bool result = a == 1 && a == 2 && a == 3;
            Console.WriteLine(result);
            Console.ReadKey();
        }

你會發現,為true,是吧

 


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

-Advertisement-
Play Games
更多相關文章
  • 所有文章僅是筆記!都是看網上大神或者視頻學習來的。 一、軟體層面機器碼翻譯(為了吹的牛B:write once run everywhere) 二、記憶體管理:java經久不衰的原因之一 ...
  • Python的錯誤異常在大部分IDE編輯器中則可以直接顯示出來,便於開發人員的調試及修改工作,對初學者也比較友好。 Python中包含錯誤和異常兩種情況,錯誤主要是常見的語法錯誤SyntaxError,並且在錯誤提示中會有倒三角箭頭的修改指示位置;python中的另外一種錯誤提醒叫做異常,指的是在語 ...
  • 好,大家好,我是Simon。接下來的時間由我和大家一起學習VC編程。 那麼我們現在的話就是開始去進入實際的一個程式設計階段。 那麼這個的話是說編寫一個全屏截圖工具。那麼這個工具的話就是我們採用一個cimage的一個類。 然後對它進行一個截圖操作。那麼採用這個類的話,主要是方便,然後再說快捷。在這... ...
  • 值類型、引用類型和泛型 多語言 咱們先不說主題,先說說CLR支持多語言。 .net有個非常強大的特點,那就是跨語言,支持很多語言,比如C#、J#等。先來個圖看一看 看到這個圖,每個語言都有自己的編譯器,通過第一次編譯,編譯成中間文件(dll或是exe文件)。在程式運行的時候,再次編譯把中間文件編譯成 ...
  • asp.net core 2.1 部署IIS(win10) 概述 與ASP.NET時代不同,ASP.NET Core不再是由IIS工作進程(w3wp.exe)托管,而是使用自托管Web伺服器(Kestrel)運行,IIS則是作為反向代理的角色轉發請求到Kestrel不同埠的ASP.NET Core ...
  • 1、Parallel.Invoke 主要用於任務的並行 這個函數的功能和Task有些相似,就是併發執行一系列任務,然後等待所有完成。和Task比起來,省略了Task.WaitAll這一步,自然也缺少了Task的相關管理功能。它有兩種形式: Parallel.Invoke( params Action ...
  • ASP.NET Core MVC中所提供的Model Binding功能簡單但實用,其主要目的是將請求中包含的數據映射到action的方法參數中。這樣就避免了開發者像在Web Forms時代那樣需要從Request類中手動獲取數據的繁鎖操作,直接提高了開發效率。此功能繼承自ASP.NET MVC,所 ...
  •  如何測量並報告ASP.NET Core Web API請求的響應時間 介紹 大家都知道性能是API的流行語。而相應時間則是API性能的一個重要並且可測量的參數。在本文中,我們將瞭解如何使用代碼來測量API的響應時間,然後將響應時間數據返回到客戶端。 作者:依樂祝 原文地址:https://www ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...