适当使用静态方法

从概念上讲,当方法只接受输入并将输入重新格式化为输出时,使用静态方法(C#)是否合适? 例如:

public static string FormatString(string inputString){ return "some formatting" + inputString + "Some other formatting"; } 

如果我有一些这样的方法,静态的“实用”类是一个好主意吗?

到目前为止,我同意其他答案,这在很多时候肯定是有道理的。

有时 ,您可能希望通过定义接口并使用实例方法实现该接口,从而为自己提供更多灵活性。 这使您可以选择在您的代码中使用不同的方法。

这是我的意思的一个例子。 假设您在某些代码中使用此formatString方法,如下所示:

 public void DumpToConsole() { foreach (DataField field in m_fields) { Console.WriteLine(StringUtils.formatString(field.ToString())); } } 

好的,这很棒。 (实际上,它是愚蠢的,但无论如何只是为了说明!)但是你可以通过接受一个接口来使这种方法更灵活,你可能有各种各样的实现提供完全不同的格式:

 public void DumpToConsole(IFormatter formatter = null) { // Perhaps you could specify a default. Up to you. formatter = formatter ?? Formatter.Default; foreach (DataField field in m_fields) { Console.WriteLine(formatter.Format(field)); } } 

然后,而不是StringUtils是一个静态实用程序类,它只是一个类的一个实现,它提供了一种格式化某种类型对象的方法(在你的例子中, string对象;在我的例子中,这些虚构的DataField对象)。

所以这是一个非常冗长的说法,这取决于。 如果你的目标是提高超级灵活性, 也许你应该考虑实现一个接口,而不是使用静态助手类。

请注意,在上面的示例中,另一个完全可以接受的方法是接受Func委托而不是这个假设的IFormatter接口。 在我看来,这主要是一种风格选择。 但是,当您想要自定义多个行为时,接口通常会变得更加真实; 即,与接受单个接口相比,定义接受3,4或更多代表的方法可能很快变得麻烦。

是的,如果您有几个通常相关的静态方法,那么将它们放在一个静态实用程序类中是个好主意。

如果你在讨论约定,那么值得注意的是,大多数.NET代码中的命名约定都要求使用Pascal的公共成员(因此使用FormatString而不是formatString )和基于camel的参数和字段(所以inputString而不是InputString )。

如果您将这些公开,那么是的,制作某种类型的实用程序类可能更好。

话虽如此,我会尽量使其成为“通用目的”,否则,它们往往会很快变得难以维持。

是的,在C#中使用它们的静态方法与C ++的“自由函数”概念非常相似。 事实恰巧C#没有免费function。 Eric Lippert在这里有一个有趣的post,为什么会这样。 静态类用于对类似实用程序的函数进行分组,如果您有几个相似的函数,则它们是合适的。

是的,没关系,你的class级将充当相关职能的“图书馆”。 你的其他选择是要么用各种函数污染全局命名空间,要么创建一个不需要的Singleton,因为没有’state’可以解释…

是的,你可以这样做。 或者您可以创建一个字符串扩展方法。

msdn扩展方法

对于上面的示例,我将使用字符串格式化程序而不是内联串联。

 string.Format("some formatting {0} some other formatting", inputString ) 

如果特定格式在代码中的多个位置有用。

如果它只在一个特定的类中有意义,那么我宁愿使用私有方法(静态或实例,它不会有所作为)。

实用程序类是有用的。 你唯一应该注意的是不要经常使用它们。 如果你的大多数代码都在实用程序类中,那么你做错了。 但是在辅助方法中分解一些常见代码是完全合理的用法。

您可以使用扩展方法来扩展String类。 它会使调用代码更整洁,但最终只是个人品味的问题。

  public static string MyWeirdFormat(this string str) { return string.Format("{0} is weird",str); } public static void Test() { string myString = "ABCD"; string weirdString = myString.MyWeirdFormat(); } 

在我看来答案是肯定的,你会把这些方法放在Utility(Util)类中。 在我目前正在处理的基于Java Web的应用程序上,我们实际上有3个这样的Util类,每个类都只包含与您显示的类似的静态方法。 我们有3的原因是一个仅用于客户端的Util方法,一个用于仅服务器,另一个用于共享Util方法。

根据您的应用程序的不同,您可能会得到类似的东西。

顺便说一句,如果您想了解更多关于何时在C#中使用静态类的信息,请查看此处 。

我希望能够充分回答你的问题。

我个人更倾向于使用扩展方法,但仍然是静态的;)

 public static class StringExtensions { public static string MyFormat(this string input) { return string.Format("some formatting {0} Some other formatting", input); } }