C#中的Helper方法:静态还是非静态?

时间:2010-08-30 20:51:26

标签: c#

我有一个带有一些函数的类,这些函数实际上只是'helper'方法,客户端代码可以用其他公共访问器属性/方法来实现,我还没有决定是否应该将它们定义为属性将实例作为参数的getter,实例方法或静态方法。另外,我还从类中提取了一个接口,除了构造之外,它几乎用在所有地方,以允许我的代码使用针对接口实现的任何类。

问题是,从设计的角度来看哪个最好?例如,作为从这个类中获取首字母的一种方法:

class Person : IPerson {
  private string name;

  public string Name { get { return this.name; } }

  // Property with getter
  public string Initial { get { return this.name.Substring(0,1); } }

  // Instance method
  public string GetInitial { return this.name.Substring(0,1); }

  // Static method
  public static string GetInitial(IPerson person) {
    return person.Name.Substring(0,1);
  }
}

该属性适用于更短,更易读的客户端代码,但是需要任何针对IPerson实现的人编写自己的实现,就像实例方法一样。

静态方法意味着实现类不需要自己编写,我的代码可以保证如何根据名称确定初始化,但这意味着它不能在接口上,而客户端代码是更加冗长。

是否仅仅考虑是否允许实现类来指定如何计算辅助方法是一个好主意?

编辑:轻微一点,为什么不让SO添加最佳实践标签?

2 个答案:

答案 0 :(得分:10)

扩展方法怎么样?

namespace IPersonExtensions
{
    public static class IPersonExtensionClass
    {
        public static string Initial(this IPerson @this)
        {
            return @this.name.Substring(0, 1);
        }
    }
}

像这样使用:

string initial = person.Initial();

这样,您可以共享实现,而无需继承或重写代码。使用单独的命名空间可以让用户选择是否要使用此代码。

答案 1 :(得分:1)

我来回走动,但我开始倾向于让它们非静态

静态案例:强制您声明该函数不使用成员变量并使其保持无状态。如果你因为需要成员变量而不小心让状态蠕变,编译器会警告你,你必须做出具体的决定。

成员函数的情况:静态函数很难继承,因此很难改变行为。使测试更加困难,因为替换该功能更难以测试其他东西。假设你有一些使用Initial的东西,你想要返回一些特定的测试...

作为一个(并且是一个极端的例子),我的一些扩展使用IOC容器来定位一个具体类并在其上调用一个成员。

相关问题