2009-11-13 6 views
6

概念的な質問のビット:オペレータのC#でのオーバーロード - 実際のコードコードはどこに行くべきですか?

Vector3(3 int値)の静脈内にカスタム構造を作成していますが、標準の演算子(+、 - 、*、/)をオーバーロードしていました。 == etc ...)

私は外部使用のためのライブラリを構築しているので、私はFxCopの規則に従おうとしています。したがって、同じ機能を実行するメソッドを持つことをお勧めします。

例: .Add()、.Subtract()など...

コードの重複を避けるために、これらのメソッドの1つ(演算子のオーバーロードまたは実際のメソッド)がもう1つを呼び出すことになります。

私の質問は、どちらを呼び出す必要がありますか?

は、それは(これが唯一のコード例です):

A)

public static MyStruct operator +(MyStruct struc1, MyStruct struct2) 
    { 
     return struc1.Add(struct2); 
    } 

    public MyStruct Add(MyStruct other) 
    { 
     return new MyStruct (
      this.X + other.X, 
      this.Y + other.Y, 
      this.Z + other.Z); 
    } 

か:

B)

public static MyStruct operator +(MyStruct struc1, MyStruct struct2) 
    { 
     return new MyStruct (
      struct1.X + struct2.X, 
      struct1.Y + struct2.Y, 
      struct1.Z + struct2.Z); 
    } 

    public MyStruct Add(MyStruct other) 
    { 
     return this + other; 
    } 

私は本当にわからないんだけどいずれかが望ましいですが、私はいくつかの意見を探しています:)

+1

なぜ2つのパラメータを使用してスタティックではなく、メソッドインスタンスをベースにしましたか?それはFxCopが薦めたものですか? –

答えて

24

私はAと行くだろう)。演算子のオーバーロードはCLSに準拠していないため(すべての.NET言語で演算子のオーバーロードがサポートされているわけではありません)、実際の Addメソッドのまわりの構文的な砂糖と考えることができます。

+0

ああ、私はオペレータのオーバーロードがCLIに準拠していないことを認識していませんでした。 A)そうです。ありがとう! –

+1

これはCLIに準拠していないということは、コンパイルされたdllが他の言語では動作しないことを意味するものではありません。 – Dykam

+0

@Dykam:もちろん、そうではありませんが、顧客が+の演算子オーバーロードをサポートしていないCLI言語を使用する場合は、MyStruct.op_Addition(myStruct1、myStruct2)のような記述が必要です。 – bitbonk

0

これは、オペレータで実際に使用されている値/プロパティを調べるときに、より直観的な場所であるため、オプションBに投票します。

3

いずれかです。本当に問題ではありません。とにかくコードがインライン化されることを期待していますので、読みやすくするためには何でも考えてください。

+1

しかし、彼が求めているのはまさにそれです。 – Letterman

1

それはstructですので、継承が問題(そうでない場合は「」virtualが容易になります)ではありません - 私は、私はAdd呼び出すよりも+多くを呼び出すことを期待するというだけの理由、「B」となるだろう...間接差が少ない

+が本当に必要なclassであり、継承(ありそうもない)の場合は、「A」になります。

2

間違いなくA.

本物の方法です。メソッドは余分なパラメータを得ることができ、仮想としてマーク(=>オーバーライド可能)、オーバーロードされ、一般に言語の性質がますます高くなります。実用的な理由を探す前に、私はあなたがそれを感じる必要があると思う。 の代わりに、CIL言語プロトコルは、オペレータのオーバーロードをサポートするためのバインドではなく、この種のメソッドに対する明確な勝利です。

0

私はオペレータのオーバーロードを実際のメソッドをラップしているシンタックスメカニズムとして見ているため、上記の理由の多くについてAと一緒に行く予定です。

関連する問題