C#演算子のオーバーロード
あなたは組み込みのC#の演算子を再定義するか、上書きすることができます。 そのため、プログラマはユーザー定義型の演算子を使用することができます。 オーバーロード演算子は、キーワード演算子 operatorのシンボル定義に続いて、特別な関数名を有するものです。 そして、他の機能は、オーバーロードされた演算子には、戻り値の型とパラメータリストを持っています。
たとえば、次の関数を考えてみます。
パブリック静的ボックス演算子+(ボックスB、ボックスC) { ボックスボックス=新しいボックス(); box.length =のb.length + c.length。 box.breadth = b.breadth + c.breadth。 box.height = b.height + c.height。 ボックスを返します。 }
上記の機能は、ユーザー定義クラスのボックスが加算演算子(+)を実装しています。 これは、2つのボックスオブジェクトのプロパティが追加され、リターンボックスオブジェクトを追加しました。
達成するために、演算子オーバーロード
次のプログラムは、完全な実装を示しています。
システムを用いました。 名前空間のOperatorOvlApplication { クラスボックス { プライベート倍の長さ; //長プライベートダブル幅; //幅プライベートダブル高さ; //高さの公共ダブルgetVolume() { 戻り値の長さ*幅*高さ。 } 公共ボイドはsetLength(ダブルLEN) { 長= LEN。 } 公共ボイドsetBreadth(ダブルBRE) { 幅= BRE。 } ます。public void setHeight(ダブル丙) { 高さ=丙; } 2ボックスの合計に//オーバーロード+演算子は、パブリック静的ボックス演算子+(ボックスB、ボックスc)のオブジェクト { ボックスボックス=新しいボックス(); box.length =のb.length + c.length。 box.breadth = b.breadth + c.breadth。 box.height = b.height + c.height。 ボックスを返します。 } } クラステスター { 静的な無効メイン(文字列[] args) { ボックスBOX1 =新しいボックス(); //はBOX1を宣言し、型ボックス ボックスBox2の=新しいボックス(); //はBox2のを宣言し、型ボックス ボックスBOX3 =新しいボックス(); //はBOX3を宣言し、型ボックス ダブルボリューム= 0.0; // // BOX1ボリュームBox1.setLength(6.0)を詳述します。 Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2のはBox2.setLengthを詳述(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); ボリュームの// BOX1体積= Box1.getVolume(); Console.WriteLineを( "BOX1量:{0}"、ボリューム)。 ボリュームの// Box2の体積= Box2.getVolume(); Console.WriteLineを( "Box2の量:{0}"、ボリューム)。 // 2のオブジェクトはBOX3 = BOX1 + Box2の追加されます。 ボリュームの// BOX3体積= Box3.getVolume(); Console.WriteLineを( "BOX3量:{0}"、ボリューム)。 Console.ReadKey()。 } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
BOX1量:210 Box2の量:1560 BOX3量:5400
リロード可能と非オーバーロードされた演算子
次の表は、C#の演算子オーバーロードの能力を説明します。
运算符 | 描述 |
---|---|
+, -, !, ~, ++, -- | 这些一元运算符只有一个操作数,且可以被重载。 |
+, -, *, /, % | 这些二元运算符带有两个操作数,且可以被重载。 |
==, !=, <, >, <=, >= | 这些比较运算符可以被重载。 |
&&, || | 这些条件逻辑运算符不能被直接重载。 |
+=, -=, *=, /=, %= | 这些赋值运算符不能被重载。 |
=, ., ?:, ->, new, is, sizeof, typeof | 这些运算符不能被重载。 |
例
上記の議論については、のは、上記の例を拡張でき、より多くのオーバーロードされた演算子:
システムを用いました。 名前空間のOperatorOvlApplication { クラスボックス { プライベート倍の長さ; //長プライベートダブル幅; //幅プライベートダブル高さ; //高さの公共ダブルgetVolume() { 戻り値の長さ*幅*高さ。 } 公共ボイドはsetLength(ダブルLEN) { 長= LEN。 } 公共ボイドsetBreadth(ダブルBRE) { 幅= BRE。 } ます。public void setHeight(ダブル丙) { 高さ=丙; } 2ボックスの合計に//オーバーロード+演算子は、パブリック静的ボックス演算子+(ボックスB、ボックスc)のオブジェクト { ボックスボックス=新しいボックス(); box.length =のb.length + c.length。 box.breadth = b.breadth + c.breadth。 box.height = b.height + c.height。 ボックスを返します。 } パブリック静的ブール演算子==(ボックスLHS、ボックスRHS) { ブールステータス=偽; 場合(lhs.length == rhs.length && lhs.height == rhs.height && Lhs.breadth == rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } パブリック静的ブール演算子!=(ボックスLHS、ボックスRHS) { ブールステータス=偽; (lhs.length!= rhs.length || lhs.height!= rhs.height場合 || Lhs.breadth!= Rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } パブリック静的ブール演算子<(ボックスLHS、ボックスRHS) { ブールステータス=偽; (lhs.length <rhs.length && lhs.height場合 <Rhs.height && lhs.breadth <rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } パブリック静的ブール演算子>(ボックスLHS、ボックスRHS) { ブールステータス=偽; (lhs.length> rhs.length && lhs.height場合 > Rhs.height && lhs.breadth> rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } パブリック静的ブール演算子<=(ボックスLHS、ボックスRHS) { ブールステータス=偽; (lhs.length <= rhs.length && lhs.height場合 <= Rhs.height && lhs.breadth <= rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } パブリック静的ブール演算子> =(ボックスLHS、ボックスRHS) { ブールステータス=偽; (lhs.length> = rhs.length && lhs.height場合 > = Rhs.height && lhs.breadth> = rhs.breadth) { ステータス=はtrue。 } ステータスを返します。 } 公共オーバーライド文字列のToString() { String.Formatの(「({0}、{1}、{2}) "、長さ、幅、高さ)を返します。 } } クラステスター { 静的な無効メイン(文字列[] args) { ボックスBOX1 =新しいボックス(); //はBOX1を宣言し、型ボックス ボックスBox2の=新しいボックス(); //はBox2のを宣言し、型ボックス ボックスBOX3 =新しいボックス(); //はBOX3を宣言し、型ボックス ボックスBox4 =新しいボックス(); ダブルボリューム= 0.0; // // BOX1ボリュームBox1.setLength(6.0)を詳述します。 Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2のはBox2.setLengthを詳述(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); //(オーバーロードされたToStringメソッドを使用して)2つのボックスConsole.WriteLineを( "BOX1:{0}"、Box1.ToString())が表示されます。 Console.WriteLineを( "Box2の:{0}"、Box2.ToString()); ボリュームの// BOX1体積= Box1.getVolume(); Console.WriteLineを( "BOX1量:{0}"、ボリューム)。 ボリュームの// Box2の体積= Box2.getVolume(); Console.WriteLineを( "Box2の量:{0}"、ボリューム)。 // 2のオブジェクトはBOX3 = BOX1 + Box2の追加されます。 Console.WriteLineを( "BOX3:{0}"、Box3.ToString()); ボリュームの// BOX3体積= Box3.getVolume(); Console.WriteLineを( "BOX3量:{0}"、ボリューム)。 //ボックスを比較します (BOX1> Box2の)場合 Console.WriteLineを( "Box2のより大きいBOX1"); ほかに Console.WriteLineを( "Box2のより多くのではないのBOX1"); (BOX1 <Box2の)場合 Console.WriteLineを( "BOX1 Box2の未満"); ほかに Console.WriteLineを( "Box2の未満ではないのBOX1"); (BOX1> = Box2の)場合 Console.WriteLineを( "BOX1以上Box2の」)。 ほかに Console.WriteLineをは(「ない以上Box2のBOX1 "); (BOX1 <= Box2の)場合 Console.WriteLineを( "BOX1少ないBox2の"); ほかに Console.WriteLineを( "BOX1小さくないBox2の"); (BOX1!= Box2の)場合 Console.WriteLineを( "BOX1等しくないBox2の"); ほかに Console.WriteLineを( "BOX1等しくBox2の"); Box4 = BOX3。 (BOX3 == Box4)の場合 Console.WriteLineを( "BOX3等しくBox4"); ほかに Console.WriteLineを( "BOX3等しくないBox4"); Console.ReadKey()。 } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
BOX1:(6、7、5) BOX2:(12、13、10) BOX1量:210 Box2の量:1560 BOX3:(18、20、15) BOX3量:5400 BOX1 Box2のより多くのではありません BOX1 Box2の未満 BOX1 Box2のではなく以上で BOX1 Box2の少ないです BOX1 Box2の等しくありません BOX3等しくBox4