在这种情况下,我应该使用扩展方法还是成员方法?

本文关键字:方法 成员方法 扩展 这种情况下 我应该 | 更新日期: 2023-09-27 18:06:18

例如

        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()是一个扩展方法。然而,我认为一个等效的方法是在类中定义一个私有成员方法,这样MakeAccumulated(a).ToArray()就可以给出{1,3,6,10,15}

什么是好的实践?

在这种情况下,我应该使用扩展方法还是成员方法?

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

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

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

我会选择成员函数方法,因为extensions methods,我个人,选择我无法扩展的东西,或者有问题要扩展(复杂性,不是我的代码,序列化问题,无论如何…)。在您的情况下,您有一个自己编写的类,因此只需通过遵循clear OOP设计来扩展它。

对于扩展方法,您需要定义另一个类,对于不太熟悉您的代码的人,或者对于2年后的您来说,将不是很清楚为什么要这样做。

问候。

如果. accumulate()只能从类的实例中调用,则使其成为类的成员。如果只在一个类的实例中使用int[](或其他人指出的Ienumerable)的应用程序范围的扩展方法是不切实际的。请记住,扩展方法只是为了增加可扩展性。

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(),你会把它放在实用程序类中吗?但是,如果在应用程序的其他地方使用. accumulate(),则可以使用扩展方法。