Unity3D C#語法之==和!=運算子過載
阿新 • • 發佈:2019-02-18
前言
在編碼中,為了提高程式碼的可讀性,我們常常會去過載運算子以封裝一些運算,良好的運算子過載,能夠極大的提高程式碼的可讀性。本文會講==以及!=運算子過載。
過載函式
在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)方法,避免了對過載運算子的使用。