c# - C# : Static or non-static? 中的辅助方法

标签 c#

我有一个包含一些功能的类,这些功能实际上只是客户端代码可以使用其他公共(public)访问器属性/方法自行完成的“辅助”方法,我不确定是否应该将这些定义为属性将实例作为参数的 getter、实例方法或静态方法。此外,我还从类中提取了一个接口(interface),该类几乎在构造时无处不在,以允许我的代码使用针对该接口(interface)实现的任何类。

问题是,从设计的角度来看,哪个最好?例如,作为从此类获取初始值的一种方式:

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 实现的人编写自己的实现,实例方法也是如此。

静态方法意味着实现类不需要自己写,我的代码可以保证初始是如何根据名称确定的,但这意味着它不能在接口(interface)上,客户端代码是更详细一点。

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

编辑:除此之外,为什么不让我添加最佳实践标签?

最佳答案

扩展方法怎么样?

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

像这样使用它:

string initial = person.Initial();

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

关于c# - C# : Static or non-static? 中的辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3604137/

相关文章:

c# - 依赖解析器的 Automapper IMapper 问题

c# - 将 View 中的 src 属性设置为 MVC3 项目之外的 url

c# - 同时多线程和异步

c# - unity socket 程序不运行

c# - 为什么collection1 和collection2 有相同的值?

c# - 小巧玲珑的查询(..): stream or loads all?

C#:如何在虚拟模式下有效地过滤(隐藏)ListView 项目?

c# - 使用 IpagedList 创建查询字符串列表

c# - 数据库连接期间的 UI 锁定

c# - 在 XmlSerializer 的输出中交换 xsd 和 xsi