为什么静态方法需要包装到类中

本文关键字:包装 静态方法 为什么 | 更新日期: 2023-09-27 18:14:53

很抱歉这个问题不太有学问。如果有一个简单的答案,只要一个解释的链接就会让我非常高兴。

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

我在一些明显的地方使用它,比如

    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:

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

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

eric lippert的这篇文章给出了相当详细的解释。我不确定这个家伙"eric"是否知道他在说什么;-)

让方法在一个随机的命名空间中晃来晃去有点尴尬。

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

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

这更像是一个组织设计,而不是由于技术限制。

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