最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到實戰(zhàn)詳解C#運算符重載的用法和注意事項

 更新時間:2026年03月02日 08:22:23   作者:bugcome_com  
本文詳細介紹了C#中運算符重載的基本概念、語法、常見陷阱、工程級寫法以及設(shè)計原則,通過一個完整的Box示例,展示了如何為自定義類型重載運算符,并討論了運算符重載在實際開發(fā)中的應(yīng)用和注意事項,需要的朋友可以參考下

在日常開發(fā)中,我們經(jīng)常會對自定義類型進行“加減乘除”或“大小比較”等操作。如果每次都通過方法調(diào)用(如 Add()、CompareTo())來實現(xiàn),不僅代碼冗長,可讀性也較差。

這時,運算符重載(Operator Overloading) 就能讓我們的自定義類型像內(nèi)置類型一樣自然地參與運算。

本文將通過一個完整的 Box 示例,帶你系統(tǒng)掌握:

  • 運算符重載的基本語法
  • 底層原理
  • 常見陷阱
  • 工程級寫法
  • 面試高頻考點

一、什么是運算符重載?

在 C# 中,運算符重載允許我們?yōu)樽远x類型重新定義運算符的行為。

例如:

Box box3 = box1 + box2;

原本 + 只能用于數(shù)值類型,但通過運算符重載,我們可以讓 Box 也支持加法運算。

二、運算符重載的基本語法

在 C# 中,重載運算符必須滿足三個條件:

  1. 必須使用 public static
  2. 必須使用 operator 關(guān)鍵字
  3. 至少有一個參數(shù)是當前類型

基本語法:

public static 返回類型 operator 運算符(參數(shù)列表)
{
    // 實現(xiàn)邏輯
}

三、基礎(chǔ)示例:實現(xiàn) Box 的加法運算

class Box
{
    private double length;
    private double breadth;
    private double height;

    public double GetVolume()
    {
        return length * breadth * height;
    }

    public void SetLength(double len) => length = len;
    public void SetBreadth(double bre) => breadth = bre;
    public void SetHeight(double hei) => height = hei;

    // 重載 +
    public static Box operator +(Box b, Box c)
    {
        Box box = new Box();
        box.length = b.length + c.length;
        box.breadth = b.breadth + c.breadth;
        box.height = b.height + c.height;
        return box;
    }
}

使用方式:

Box3 = Box1 + Box2;

相比:

Box3 = Box.Add(Box1, Box2);

代碼更加自然、可讀性更強。

四、擴展:重載比較運算符

可以重載:

  • ==
  • !=
  • <
  • >
  • <=
  • >=

示例:

public static bool operator ==(Box lhs, Box rhs)
{
    return lhs.length == rhs.length &&
           lhs.breadth == rhs.breadth &&
           lhs.height == rhs.height;
}

五、== 的隱藏陷阱(高頻面試點)

默認情況下,引用類型的 == 比較的是:

內(nèi)存地址

Box a = new Box();
Box b = new Box();
Console.WriteLine(a == b); // False

如果你重載了 ==必須同時:

public override bool Equals(object obj)
public override int GetHashCode()

否則在以下場景會出問題:

  • Dictionary
  • HashSet
  • LINQ Distinct
  • 集合查找

這是很多開發(fā)者踩過的線上坑。

六、為什么運算符必須是 static?

當你寫:

Box3 = Box1 + Box2;

編譯器會轉(zhuǎn)換為:

Box3 = Box.operator +(Box1, Box2);

也就是說:

運算符本質(zhì)是類型級別的靜態(tài)方法

因此必須是 static。

運算符重載本質(zhì)上是一種“語法糖”。

七、可重載與不可重載運算符

? 可以重載

類型運算符
一元+ - ! ~ ++ --
二元+ - * / %
比較== != < > <= >=

? 不能重載

  • =
  • .
  • ?:
  • new
  • is
  • typeof
  • sizeof
  • &&
  • ||
  • += 等復(fù)合賦值

注意:

雖然不能直接重載 +=,但只要重載 +,+= 會自動支持。

八、工程級推薦寫法(生產(chǎn)環(huán)境版本)

下面是符合 .NET 規(guī)范的寫法:

public class Box : IEquatable<Box>, IComparable<Box>
{
    public double Length { get; set; }
    public double Breadth { get; set; }
    public double Height { get; set; }

    public double Volume => Length * Breadth * Height;

    public static Box operator +(Box a, Box b)
    {
        return new Box
        {
            Length = a.Length + b.Length,
            Breadth = a.Breadth + b.Breadth,
            Height = a.Height + b.Height
        };
    }

    public static bool operator ==(Box a, Box b)
    {
        if (ReferenceEquals(a, b)) return true;
        if (a is null || b is null) return false;
        return a.Equals(b);
    }

    public static bool operator !=(Box a, Box b) => !(a == b);

    public bool Equals(Box other)
    {
        if (other is null) return false;
        return Length == other.Length &&
               Breadth == other.Breadth &&
               Height == other.Height;
    }

    public override bool Equals(object obj)
        => Equals(obj as Box);

    public override int GetHashCode()
        => HashCode.Combine(Length, Breadth, Height);

    public int CompareTo(Box other)
        => Volume.CompareTo(other.Volume);
}

現(xiàn)在具備:

  • 集合安全
  • 排序支持
  • 值語義支持
  • 符合 .NET 規(guī)范

九、設(shè)計原則(高級思維)

1?? 保持語義一致

不要濫用運算符。

例如:

public static Box operator +(Box b, int x)

語義不清晰會導(dǎo)致代碼難以維護。

2?? 不要產(chǎn)生副作用

運算符應(yīng)返回新對象,而不是修改原對象。

3?? 只用于“數(shù)學(xué)模型類”

適合使用的場景:

  • 向量類
  • 金額類
  • 幾何類
  • 時間區(qū)間類
  • 物理量模型

不適合:

  • 業(yè)務(wù)實體類
  • 復(fù)雜業(yè)務(wù)邏輯對象

十、面試高頻問題總結(jié)

1?? 運算符為什么必須 static?

因為它是類型級行為。

2?? 重載 == 必須做什么?

必須同時:

  • 重載 !=
  • 重寫 Equals
  • 重寫 GetHashCode

3?? 運算符重載本質(zhì)是什么?

語法糖,本質(zhì)是靜態(tài)方法。

4?? 能重載 && 嗎?

不能直接重載,但可以通過重載 &true/false 間接支持。

十一、優(yōu)缺點總結(jié)

優(yōu)點

  • 表達自然
  • 代碼簡潔
  • 提高可讀性
  • 更符合面向?qū)ο笏枷?/li>

缺點

  • 濫用會降低可讀性
  • 不熟悉的人難以理解
  • 忽略 Equals 會造成嚴重 bug

十二、總結(jié)

運算符重載的核心價值在于:

讓自定義類型擁有與內(nèi)置類型一樣自然的操作體驗。

但真正高級的開發(fā)者不會濫用運算符,而是在合適的模型類中合理使用。

掌握運算符重載,不只是語法能力,更是設(shè)計能力的體現(xiàn)。

以上就是從入門到實戰(zhàn)詳解C#運算符重載的用法和注意事項的詳細內(nèi)容,更多關(guān)于C#運算符重載的用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C#如何監(jiān)控選定文件夾中文件的變動情況

    詳解C#如何監(jiān)控選定文件夾中文件的變動情況

    這篇文章主要為大家詳細介紹了C#如何監(jiān)控選定文件夾中文件的變動情況,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C#操作JSON(序列化與反序列化)的方法詳解

    C#操作JSON(序列化與反序列化)的方法詳解

    .net?core提供了Json處理模塊,在命名空間System.Text.Json中,本文將通過頂級語句,對C#的Json功能進行講解,感興趣的小伙伴可以了解一下
    2023-05-05
  • WPF實時繪制心率曲線的示例詳解

    WPF實時繪制心率曲線的示例詳解

    這篇文章主要為大家詳細介紹了WPF實時繪制心率曲線的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C#代碼實現(xiàn)在PDF文件中添加圖片水印

    C#代碼實現(xiàn)在PDF文件中添加圖片水印

    為 PDF 文檔添加圖片水印,可以在一定程度上防止數(shù)據(jù)被未經(jīng)授權(quán)地使用或修改,下面我們就來看看如何在 C# 和 VB.NET 中,通過編程的方式為 PDF 添加圖片水印吧
    2026-04-04
  • c# JSON返回格式的WEB SERVICE

    c# JSON返回格式的WEB SERVICE

    首先用c#創(chuàng)建一個web service,主要是利用其WSDL的功能,當然也可以利用php創(chuàng)建一個,道理都是一樣的
    2008-12-12
  • C# winform實現(xiàn)自動更新

    C# winform實現(xiàn)自動更新

    這篇文章主要為大家詳細介紹了C# winform實現(xiàn)自動更新的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • C#多線程之任務(wù)的用法詳解

    C#多線程之任務(wù)的用法詳解

    本文詳細講解了C#多線程之任務(wù)的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中的where泛型約束介紹

    C#中的where泛型約束介紹

    這個關(guān)于泛型約束的東西我看了幾天了。一直沒打看懂,我的領(lǐng)悟能力有點差,剛才突然明白了一點
    2013-04-04
  • C#結(jié)合Spire.Doc for .NET實現(xiàn)智能復(fù)制Word文檔內(nèi)容

    C#結(jié)合Spire.Doc for .NET實現(xiàn)智能復(fù)制Word文檔內(nèi)容

    在日常的開發(fā)工作或文檔處理中,我們常常需要將一個Word文檔中的內(nèi)容復(fù)制到另一個文檔,本文將為您揭示如何利用C#編程語言與強大的Spire.Doc for .NET庫,實現(xiàn)Word文檔內(nèi)容的智能復(fù)制,感興趣的小伙伴可以了解下
    2026-01-01
  • C#如何調(diào)用MFC 窗口 DLL

    C#如何調(diào)用MFC 窗口 DLL

    這篇文章主要介紹了C#如何調(diào)用MFC 窗口 DLL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

苍山县| 黄骅市| 故城县| 专栏| 获嘉县| 西华县| 北辰区| 武平县| 西丰县| 招远市| 马龙县| 遵义县| 巴塘县| 岳普湖县| 通道| 南涧| 揭西县| 巴里| 南康市| 惠安县| 东乌| 河曲县| 南皮县| 昔阳县| 常州市| 壶关县| 闻喜县| 敦化市| 彰武县| 轮台县| 鞍山市| 教育| 赤水市| 榆社县| 临武县| 天等县| 清原| 炉霍县| 什邡市| 醴陵市| 宁陕县|