Расширение или статическая функция? - PullRequest
4 голосов
/ 14 декабря 2011

Я разрабатываю проект среднего размера, где исполнители действительно важны.Я не смог найти (на самом деле не могу понять) разницу между статическими функциями и функциями расширения.

Например:

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. Vector2 calc = myVector.MyTransform (0.45f);
  2. Vector2 calc = My.MyTransform (myVector, 0.45f)

Какой из них выпредпочитаете использовать или предпочитаете использовать и почему?

Спасибо!

Ответы [ 4 ]

9 голосов
/ 14 декабря 2011

Там будет нет разница в производительности - вызов метода расширения

var result = foo.MyTransform(rotation);

будет просто преобразован компилятором в:

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

Это не значит, что методы расширения должны использоваться везде - но похоже, что это подходящий вариант использования, если только вы не можете на самом деле сделать его методом экземпляра в Rotation :

var result = rotation.Apply(foo);

(Кроме того, я настоятельно призываю вас пересмотреть свои имена, чтобы следовать соглашениям об именах .NET.)

5 голосов
/ 14 декабря 2011

Методы расширения ARE статические методы.Они просто синтаксический сахар.Компилятор создаст обычный вызов статического метода.Это означает, что они эквивалентны.

3 голосов
/ 14 декабря 2011

Две функции реализованы абсолютно одинаково. Логически, однако, методы расширения позволяют вам обеспечивать общую функциональность для нескольких интерфейсов , так что это больше, чем просто "синтаксический сахар".

2 голосов
/ 14 декабря 2011

Они называются «Методы расширения», а не расширяются.

Метод расширения - это просто удобный способ сделать его похожим на часть определения объекта.

Если вы пишете:

public static void DoSomething(this MyObject myObject) { }

Это означает, что вы сможете вызывать его так из экземпляра MyObject:

myObject.DoSomething();

Если вы опустите ключевое слово this вопределение метода, вы не сможете вызывать его так, но только так:

DoSomething(myObject);

Обратите внимание, что в то время как первый вызов возможен, только если вы пишете метод как метод расширения (сthis (ключевое слово), последнее возможно в обоих случаях.

...