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

Fly*_*179 6 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Joh*_*her 10

扩展方法怎么样?

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

像这样使用它:

string initial = person.Initial();
Run Code Online (Sandbox Code Playgroud)

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

  • Flynn似乎从零开始创建这个类.如果是这种情况,则不应使用扩展方法,因为您可以访问源代码.当您无法修改或扩展基类时,应使用扩展方法.MSDN一般指南本书http://msdn.microsoft.com/en-us/library/bb383977.aspx"一般情况下,我们建议您谨慎实施扩展方法,并且仅在必要时实施.尽可能扩展必须扩展的客户端代码现有类型应该通过创建从现有类型派生的新类型来实现." (3认同)