2009-08-26 13 views
2

私は、いくつかの演算子がオブジェクトの点でどのように動作するか(+、 - )が不思議です。演算子を非数学的オブジェクトに適用しますか?

は、私はいつものEventHandlerはメソッドを追加することによって、どのように動作するか不思議に思っていました:

Foo.Action += new FooActionHandler 

をイベントでない場合は、どのような比較を返すでしょうか?

DateTime - DateTime 

TimeSpanオブジェクトが返されますが、それは可能な方法について少し戸惑っています。私はこれらの方法を常に使用していますが、私はそれらの内部の仕組みを理解していません。このようなことをするために自分のクラスをどのように作りますか?

答えて

10

あなたが好きなアクションを実行するための演算子をオーバーロードすることができます。 Here is some good documentation C#でそれを行う方法については。

要点は、演算子(クラス)のコンテキストと、その演算子のパラメータに何が起こるかです。サンプルは、次のようになります。これは、演算子のオーバーロードと呼ばれる

// Overload '+' for my class 
    public static MyClass operator +(MyClass c1, MyClass c2) 
    { 
     MyClass newMyClass = new MyClass(); 
     newMyClass.MyIntProperty = c1.MyIntProperty + c2.MyIntProperty; 
     return newMyClass; 
    } 
+0

それは意味があり、私がコードで見るものの多くを説明するでしょう。私はそれよりもはるかに簡単だと思った。 – Corey

3

あなたは、このように演算子を定義することができます。

public static MyClass operator +(MyClass a, MyClass b) { } 

同じ構文のためでは - 、*、など。ここ

は、いくつかのヒント(私の意見では、主に)ある:

  • 実際のロジックを演算子に入れないでください。静的メソッドを作成してください。
 
    // NOT 
    public static MyClass operator +(MyClass a, MyClass b) { /* ... */ } 
    // YES 
    public static MyClass Add(MyClass a, MyClass b) { return new MyClass(a.Prop + b.Prop); } 
    public static MyClass operator +(MyClass a, MyClass b) { return Add(a, b); } 
  • 彼らはいけない何かをする演算子を曲げないでください - すなわち、例えば、リストから削除するリストに追加する+を使用するか、または-ません。 これは二つの問題が発生:それは非常にあなたが誤って2つのオブジェクトを追加した場合、コンパイラはエラーをキャッチしません
  • コミュニティで定評されていない
    1. を。ここで
+0

AddメソッドがMyClassを返すべきで、追加されたProp値を返すべきではありませんか? –

+0

はい。私の弱い、人為的な例をくそっ! –

+0

- まだ弱いですが、おそらくコンパイル可能です。 –

0

。 C#では、選択した演算子に過負荷をかけることができます。

さらに詳しい情報はhereです。

0

オペレータに過負荷をかけて、必要な操作を行うことができます。

私はトラッククラスを考えてみましょう、とMACHINEGUNクラスは、私はこれを行うことができるようにしたい:

トランスmyTransformer = mytruck + myGun。

+0

悲しいことに(myTruck + myGun).GetType()== typeof(ScrapMetal)!= typeof(Transformer)。家庭でこれを試してはいけない、子供たち。 – stevemegson

+0

トランスフォーマーは通常トラックではありません。典型的には車から飛行機まで様々です。代わりにmyVehicleクラスを使用するのが最善の方法だと思います。 – Corey

0

EventHandlerの+ =と - =はDelegate.CombineとDelegate.Removeのショートカットです。これは演算子のオーバーロードによって実現されます。詳細はthis siteを参照してください。

0

これは、演算子のオーバーロードとして知られています。これはフレームワーク全体で広く使用されていますが、何をしているのかわからない場合は、悪いコードにつながる可能性があるので、やめてください。

ほとんどのプログラマは、演算子がオーバーロードされているカスタムクラスを見るつもりはないので、他のプログラマがコードを見て何が起こっているのか把握する必要があります。

もちろん、役に立つと思われる状況がありますが、通常、演算子オーバーロードを作成する代わりにメソッドを使用するほうがよいでしょう。あなたはここにマイクロソフトからより多くの情報を見つけることができます回答の

http://msdn.microsoft.com/en-us/library/aa288467.aspx

0

充実していますが、あなたがそれを行う方法をカバーしています。今では、あなたが実際にそれを自分でやりたいとは決して決して覚えていません。あなたは、あなたのクラスを使用する誰もが、2つのMyClassオブジェクトを減算することについてあなたに同意することを本当に確かめる必要があります。何らかの数学的構造(ベクトル、行列など)を表すなら、おそらく安全です。それ以外の場合は、おそらく不明です。マイクロソフトは、DateTimeのために減算を定義していますが、

static Foo operator -(Foo a, Foo b) 

は、あなたが減算をオーバーライドすることができなかった場合は、そのメソッドを呼びたいのかについて考えて書く

List<string> myList = new List<string>(); 
myList += "foo"; 

任意の時間を許可しなかったことに注意してください。可能な最良の名前がSubtractでない場合は、おそらく他の名前のメソッドを作成するだけです。

関連する問題