关于c#:为什么需要将静态方法包装到类中?

Why do static methods need to be wrapped into a class?

很抱歉这个问题没有实际意义。如果有一个简单的答案,只要链接到一个解释就可以让我更开心。

经过6个月的编程,我发现静态类对于存储应用于许多不同类的例程有一定的用处。下面是一个如何使用静态类的简化示例,它是一个用于将文本解析为各种内容的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class TextProcessor
{
    public static string[] GetWords(string sentence)
    {
        return sentence.Split(' ');
    }

    public static int CountLetters(string sentence)
    {
        return sentence.Length;
    }

    public static int CountWords(string sentence)
    {
        return GetWords(sentence).Length;
    }
}

我用这种明显的方式

1
2
3
4
5
6
7
8
9
10
    class Program
{
    static void Main(string[] args)
    {
        string mysentence ="hello there stackoverflow.";
        Console.WriteLine("mysentence has {0} words in it, fascinating huh??", TextProcessor.CountWords(mysentence));

        Console.ReadLine();
    }
}

我的问题是:为什么需要将这些静态方法包装在静态类中?这似乎毫无用处。有没有一种方法可以让这些方法自己不封装在类中?我知道封装是有益的,但我看不到静态类包装的静态方法的用途。有什么我错过了时尚或其他?我完全是在胡扯一棵树吗?我想得太多了吗?


在C中,任何方法都必须在类内声明。这就是指定语言的方式。

静态类实际上更像是一个模块,而不是一个类,因此我也认为您应该能够:

  • 在类之外定义一个函数,或者;
  • 导入模块的方式与导入命名空间的方式相同(使用using)

vb.net、f和nemerle实际上允许您声明模块并导入它们;什么允许您使用不合格的方法。

这是有效的Nemerle:

1
2
3
4
5
6
using System.Console; // import static methods in the Console class
class Hello {
  static Main() : void {
    WriteLine("Hello, world!"); // unqualified access!
  }
}

另外,看看扩展方法,它们可能允许您以不同的方式"解决"这个问题。您的TextProcessor中的方法要求是string扩展方法。


埃里克·利珀特的这篇文章给出了一个相当详细的解释。我不确定这家伙"埃里克"是否知道他在说什么,尽管如此;-)


如果方法只是在随机的名称空间中摇摆不定,这会有点尴尬。

我怀疑答案是提供"范围"。仅仅因为方法是静态的,并不意味着它没有作用域。它仍然可以访问其他静态私有方法或成员变量——类为这些东西提供了一个"家"。

静态类也可以有静态构造函数,这些静态构造函数在第一次使用静态方法时被调用,因此这提供了根据需要设置内容的能力。

由于技术限制,它更多的是一种组织设计。


已经有很多关于这个主题的线程有足够的信息…你可以在这里找到一个……


静态方法是在运行时创建的类的单个实例中调用的方法。