關於重載運算符大家可能都很少用,也就對他不是很理解了。
大家很少用的原因其中一個是因為寫程序的時候都是用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; //隱式轉換 感覺不到類被轉換了
實際運用來說,顯式運算符更有用,因為更明顯,可以讓程序員引起一定的關注。
上面就是我對重載運算符和轉換運算符的一些個人理解,如果偏差,大家不要砸我臭雞蛋,直接扔燒雞好了,希望對大家有點幫助