2011-12-14 79 views
4

我正在开发一个中型项目,其中performans非常重要。我无法找到(实际上无法理解)静态函数和扩展函数之间的区别。扩展或静态功能?

e.g:

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

哪一个你更喜欢使用,或者是首选使用,为什么?

谢谢!

+0

如果你正在写这个,为什么不在`Vector2`而不是`My`中写`MyTransform()`? – StuperUser 2011-12-14 13:37:11

+0

功能没有区别。这只是您想要调用函数的个人偏好。一个扩展函数可以同时调用,而一个常规的静态函数只能以一种方式调用。 – Gabe 2011-12-14 13:37:23

+0

如果这个方法需要Vector2的一个实例,为什么它是`static`? – StuperUser 2011-12-14 13:56:48

回答

9

会有没有在性能上的差异 - 到

扩展方法的调用
var result = foo.MyTransform(rotation); 

只会被编译器转换成:

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

现在,这并不是说,应该使用扩展方法无处不在 - 但它看起来像这是一个合适的用例,除非你可以实际上使其在旋转的实例方法:

var result = rotation.Apply(foo); 

(顺便说一句,我强烈建议你重新考虑一下你的名字,为了追随.NET命名约定。)

5

扩展方法ARE静态方法。他们只是语法糖。编译器将创建一个对静态方法的正常调用。这意味着,它们是等价的。

2

他们被称为“扩展方法”,不扩展。

扩展方法只是一种使它看起来像它是对象定义的一部分的简便方法。

如果你写:

public static void DoSomething(this MyObject myObject) { } 

这意味着你可以这样调用它,从MyObject一个实例:

myObject.DoSomething(); 

如果省略this关键字在方法定义,您将无法像这样称呼它,但只能如下所示:

DoSomething(myObject); 

请注意,虽然只有在将方法编写为扩展方法(使用关键字this)时才可以调用前者,但后者在两种情况下都可能。