關於重載運算符大家可能都很少用,也就對他不是很理解了。
大家很少用的原因其中一個是因為寫程序的時候都是用dataset datatable來保存數據,並沒有構建自己的數據類,這樣實現功能起來雖然很方便,但是靈活度就不夠了,一直就限制在線性表的操作。2005年以前我也是這樣做的,因為那時候我覺的dataset很方便,很好用,但是用久了就覺得,怎麼C#就是dataset datagrid 。直到深入的去看petshop的代碼,才理解了程序是什麼,什麼是架構。但是petshop是一個microsoft展示他C#的功能,所以有些功能對於實際開發並不太適用。
很多人會到論壇上問 ClassA + ClassB 為什麼會報錯,結構都一樣,為什麼會錯,microsoft怎麼那麼笨。
原因就在這裡了,你應該告訴C# 你要怎麼加,重載運算符就是告訴他,+ 法是這樣做地。。。下面是我寫的一個重載運算符+的一個例子
public class MyClass
...{
private int _x = 0;
/**//// <summary>
/// X屬性
/// </summary>
public int X
...{
get ...{ return _x; }
set ...{ _x = value; }
}
private int _y = 0;
/**//// <summary>
/// Y屬性
/// </summary>
public int Y
...{
get ...{ return _y; }
set ...{ _y = value; }
}
/**//// <summary>
/// 重載+運算符號,讓兩個對象可以進行加操作
/// </summary>
/// <param name="A">加 對象</param>
/// <param name="B">被加 對象</param>
/// <returns>結果對象</returns>
public static MyClass Operator +(MyClass A, MyClass B)
...{
MyClass resultClass = new MyClass();
resultClass.X = A.X + B.X;
resultClass.Y = A.Y + B.Y;
return resultClass;
}
}
測試代碼
MyClass classA = new MyClass(10, 20);
MyClass classB = new MyClass(1,2);
MyClass classC = classA + classB;
MessageBox.Show(classC.X.ToString());
MessageBox.Show(classC.Y.ToString());
我們可以得到11 和12 兩個結果,這樣就可以對自定義類進行加法運算了。需要注意的是 重載運算符的定義 基本可以用於單、雙目運算符,邏輯運算符不能重載(&&,||) 賦值運算符不能重載(+=,-=...)
public static MyClass operator + 的定義必須是static的,不能為其他定義.方法必須命名 Operator 符號
關於轉換運算符 是自定義類互相轉換時非常重要的的一個功能。打個不恰當的比方:一個類是男孩,一個類是男人,怎麼樣把男孩轉成男人呢。。。
轉換運算符的定義與重載運算符的定義相似,下面給出轉換運算符的例子,延用上面的MyClass在,再定義一個MyBestClass,建立轉換運算符 ,實現MyClass到MyBestClass的轉換
public class MyBestClass
...{
private float _width;
public float Width
...{
get ...{ return _width; }
set ...{ _width = value; }
}
private float _height;
public float Height
...{
get ...{ return _height; }
set ...{ _height = value; }
}
/**//// <summary>
/// 顯性轉換運算符
/// </summary>
/// <param name="ClassA"></param>
/// <returns></returns>
public static explicit Operator MyBestClass(MyClass ClassA)
...{
MyBestClass BestClass = new MyBestClass();
BestClass.Width = Convert.ToSingle(ClassA.X);
BestClass.Height = Convert.ToSingle(ClassA.Y);
return BestClass;
}
}
測試代碼如下
MyClass classA = new MyClass(10, 20);
MyBestClass BestClass = (MyBestClass)classA;
MessageBox.Show(BestClass.Width.ToString());
MessageBox .Show (BestClass .Height .ToString ());
結果是10,20
static是必須的 ,Operator 名字也是固定的,可變只有explicit
explicit表示顯式轉換,如其意思一樣,操作的時候程序員明顯知道這個類被轉換了.
還有一個種是 隱式轉換 implicit
如果
public static explicit Operator MyBestClass(MyClass ClassA)改為
public static implicit Operator MyBestClass(MyClass ClassA)那麼
MyBestClass BestClass = (MyBestClass)classA;就可以改為
MyBestClass BestClass = classA; //隱式轉換 感覺不到類被轉換了
實際運用來說,顯式運算符更有用,因為更明顯,可以讓程序員引起一定的關注。
上面就是我對重載運算符和轉換運算符的一些個人理解,如果偏差,大家不要砸我臭雞蛋,直接扔燒雞好了,希望對大家有點幫助