1. 程式人生 > >Unity3D C#語法之==和!=運算子過載

Unity3D C#語法之==和!=運算子過載

前言

在編碼中,為了提高程式碼的可讀性,我們常常會去過載運算子以封裝一些運算,良好的運算子過載,能夠極大的提高程式碼的可讀性。本文會講==以及!=運算子過載。

過載函式

在C#中,過載的時候需要使用operator關鍵詞來宣告:

public static bool operator 運算子(object1 左物件, object 右物件){}

雙目運算子在填寫引數的時候需要輸入兩個引數,第一個引數為運算子的做引數,第二個為運算子的右引數,最後返回值為運算子的自定義結果。
這裡講過載運算子只講==與!=,因為這兩個運算子是成對出現,類似的還有<和>符號。

public
struct TempStruct { public int x = 10; public static bool operator ==(TempStruct a,TempStruct b) { if(a.x == b.x) { return true; } return false; } } public static bool operator!=(TempStruct a,TempStruct b) { return !(a == b);//直接通過使用==的邏輯,避免寫重複程式碼
}

這裡在處理!=的時候,可以直接使用==的邏輯可以簡化程式碼。同樣的處理也可以放置在處理<和>的過載中。

之後我們在做兩個結構體的比較的時候,就只需要使用如下程式碼,就能比較他們值得大小。

TempStruct a,b;
if(a == b){}

升級處理

你以為這樣就完了?

對於==和!=的過載,如果輸入為空的情況,那麼上面的判斷就會報錯。那麼最簡答的修改,就是在函式中新增空判斷:

public struct TempStruct
{
    public int x = 10;
    public static bool operator ==(TempStruct a,TempStruct b)
    {
        if
(a == null)//會出現遞迴呼叫 { if(b == null) return truel return false; } if(a.x == b.x) { return true; } return false; } } public static bool operator!=(TempStruct a,TempStruct b) { return !(a == b);//直接通過使用==的邏輯,避免寫重複程式碼 }

這麼寫是很快,同時還考慮到了兩個空物件的情況,但是這樣會陷入死迴圈,因為在做空判斷的時候出現了遞迴呼叫。

為了避免這種情況,對空的處理需要換一種方式:

public struct TempStruct
{
    public int x = 10;
    public static bool operator ==(TempStruct a,TempStruct b)
    {
        if(object.Equal(a,null) ||object.Equal(b,null) )//會出現遞迴呼叫
        {
            return object.Equal(a,b);
        }
        if(a.x == b.x)
        {
            return true;
        }
        return false;
    }
}
public static bool operator!=(TempStruct a,TempStruct b)
{
    return !(a == b);//直接通過使用==的邏輯,避免寫重複程式碼
}

注意這裡對空判斷使用了object.Equal(a,b)方法,避免了對過載運算子的使用。