适当使用静态方法
从概念上讲,当方法只接受输入并将输入重新格式化为输出时,使用静态方法(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); } }