Latest web development tutorials

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