2011-12-14 11 views
4

私はperformansが本当に重要な中規模のプロジェクトを開発しています。私は静的関数と拡張関数の違いを見つけることができませんでした(実際には理解できません)。拡張機能または静的機能?

例えば:

public static class My 
{ 
    public static Vector2 MyTransform(this Vector2 point, float Rotation) 
    { 
     //.... 
     return MyVector; 
    } 

    public static Vector2 MyTransform(Vector2 point, float Rotation) 
    { 
     //.... 
     return MyVector; 
    } 
} 

これらの機能が使用されるのと同じだけの拡張機能は、そのインスタンスに呼び出される:

  1. ベクトル2 CALC = myVector.MyTransform(0.45f)。
  2. ベクトル2 CALC = My.MyTransform(myVector、0.45f)

はあなたが使用することを好むか、または使用することを好ま、なぜされている1?

ありがとうございます!

+0

これを書いているなら、 'My'ではなく' Vector2'に 'MyTransform()'を書きませんか? – StuperUser

+0

機能に違いはありません。それは、あなたが関数をどのように呼び出すかに関する個人的な好みです。拡張関数は両方向に呼び出すことができますが、通常の静的関数は片方向にしか呼び出せません。 – Gabe

+0

このメソッドがVector2のインスタンスを必要とする場合、なぜそれは 'static'ですか? – StuperUser

答えて

9

性能に違いがあります -

の拡張メソッドの呼び出し
var result = foo.MyTransform(rotation); 

単純にコンパイラによって変換されます。今では、と言うことではありません

var result = My.MyTransform(foo, rotation); 

拡張メソッドを使用する必要があります。どこでも - これは適切な使用例です。実際にはそれローテーションのインスタンスメソッドにする:

var result = rotation.Apply(foo); 

+0

あなたは命名について正しいです!答えに感謝します。 – icaptan

5

拡張メソッドARE静的メソッド。それらはただ構文的な砂糖です。コンパイラは静的メソッドへの通常の呼び出しを作成します。つまり、これは同等です。

3

(余談ですが、私は強く、.NETの命名規則に従うために、あなたの名前を再考するためにあなたを促すだろうと。)二つの関数でありますまったく同じ方法で実装されています。しかし、論理的には、拡張メソッドはprovide common functionality across multiple interfacesとなるので、単なる「構文的砂糖」以上のものです。

+0

ありがとうございます、リンクはたくさん助けます! – icaptan

2

「拡張メソッド」と呼ばれ、拡張されていません。

拡張メソッドは、オブジェクト定義の一部であるように見えるようにする便利な方法です。

あなたが書く場合:

public static void DoSomething(this MyObject myObject) { } 

それはあなたがMyObjectのインスタンスから、このようにそれを呼び出すことができるようになりますことを意味します

myObject.DoSomething(); 

あなたがthisキーワードを省略した場合メソッド定義を呼び出すことはできませんが、そのように呼び出すことはできませんが、次のようにします:

DoSomething(myObject); 

前の呼び出しは、メソッドを拡張メソッド(キーワード)として記述する場合にのみ可能ですが、後者はどちらの場合でも可能です。

+0

「拡張機能」に感謝してくれてありがとう – icaptan