适当使用静态方法

时间:2011-02-10 23:31:04

标签: c# static static-methods oop

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

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

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

10 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

到目前为止,我同意其他答案,在很多时候它确实很有意义。

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

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

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

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

public void DumpToConsole(IFormatter<DataField> formatter = null)
{
    // Perhaps you could specify a default. Up to you.
    formatter = formatter ?? Formatter<DataField>.Default;

    foreach (DataField field in m_fields)
    {
        Console.WriteLine(formatter.Format(field));
    }
}

然后代替StringUtils作为静态实用程序类,它只是一个类的实现,它提供了一种格式化某种类型对象的方法(在您的情况下,{ {1}}个对象;在我的例子中,这些虚构的string个对象。)

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

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

答案 2 :(得分:2)

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

话虽如此,我会尽量使其成为“一般目的”,否则,它们往往会很快变得无法维持。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

是的,没关系,你的班级将作为相关功能的“图书馆”。你对此的其他选择是要么用各种函数污染全局命名空间,要么创建一个不需要的Singleton,因为没有'state'可以解释......

答案 5 :(得分:2)

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

msdn extension methods

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

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

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:2)

您可以使用扩展方法来扩展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();
    }

答案 8 :(得分:2)

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

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

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

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

答案 9 :(得分:1)

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

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