我应该在这种情况下使用扩展方法或成员方法吗?

时间:2011-08-22 21:33:59

标签: c#

例如,

        class Aclass
        {
            void method1()
            { 
               int[] a = new int[5]{1,2,3,4,5};
               var b = a.Accumulated().ToArray(); // so that b = {1,3,6,10,15}
            }
        }

目前Accumulated()是一种扩展方法。但是我认为一个等价的方法是在Aclass中定义一个私有成员方法,以便MakeAccumulated(a).ToArray()给出{1,3,6,10,15}

什么是好习惯?

4 个答案:

答案 0 :(得分:2)

Aclass是一个为Aclass对象提供逻辑意义的方法的地方;最佳实践是不要将它用作辅助函数的通用存储。一个好的经验法则是,如果方法永远不会引用成员变量,那么它可能在类中不合适。

int数组上的函数可能在Aclass中没有位置。我把它放在扩展方法中。

答案 1 :(得分:1)

这不是良好做法的问题,而是偏好的问题。两者都是有效的选择。如果你只需要在Aclass的实例中使用该方法,那么我会将它限制为一个类方法,对于检查该类的其他人来说也更为明显。

答案 2 :(得分:1)

我会选择成员函数方法,导致extensions methods,我个人,选择我无法扩展的内容,或者有问题扩展到(复杂性,不是我的代码,序列化问题,无论......)。在您的情况下,您有一个由您编写的类,因此只需按照 clear OOP设计进行扩展即可。

对于扩展方法,您需要为不熟悉您的代码的人定义另一个类,或者在2年之后为您定义,为什么以这种方式完成它将不太清楚。

问候。

答案 3 :(得分:1)

如果.Accumulated()仅从Aclass实例调用,则使其成为该类的成员。如果它仅在一个类的实例中使用,那么对于int [](或者像其他人指出的那样不可用)具有应用程序范围的扩展方法是不切实际的。请记住,扩展方法只是为了增加可扩展性。

public static string Hello(this string Value) { return Value + "Hello"; }

string s = "Hello".Hello();

...与:

相同

public static string Hello(string Value) { return Value + "Hello"; }

string s = Utilities.Hello("Hello");

如果你只想在另一个类的实例中使用它,你会将.Hello()放在实用程序类中吗?但是,如果在应用程序的其他地方使用.Accumulated(),则可以使用扩展方法。