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

C# 为什么静态方法需要包装到类中?,c#,static-methods,C#,Static Methods,很抱歉,这个问题的性质很难理解。如果有一个简单的答案,只要一个链接到一个解释就会让我非常高兴 经过6个月的编程,我发现静态类对于存储应用于许多不同类的例程有些有用。这里有一个我如何使用静态类的简化示例,它是一个用于将文本解析为各种内容的类 public static class TextProcessor { public static string[] GetWords(string sentence) { return sentence.Split(' ')

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

经过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#中,任何方法都必须在类内声明。这就是指定语言的方式

静态类实际上不仅仅是一个类,因此我也认为您应该能够:

  • 在类或类之外定义函数
  • 导入模块的方式与导入命名空间的方式相同(使用
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
扩展方法。

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

将方法挂在随机名称空间中会有点尴尬

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

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


由于技术上的限制,这更像是一种组织设计。

给出了非常详细的解释。我不确定这个叫“埃里克”的家伙是否知道他在说什么;-)

很好的问题,但我怀疑这只是一个无聊的“因为Java做到了。”它最终归结为语言是如何设计的。所有方法都必须在一个类中。为什么?可能是为了保持一致性。检查这个[post][1][1]:“如果方法只是在一个随机的名称空间中徘徊,那会有点尴尬。”-大多数语言都允许这样做。大多数面向对象语言?我明白了,我明白了。因此,在C++这样的“混合”语言中,你可以访问类外的函数,但是在一个像C语言这样的僵硬的OO语言中,你必须把所有的东西封装在一个类中……有道理。Yea认为,像C++这样的语言必须与非面向对象的C“向后兼容”,所以他们必须支持它。VB.NET必须向后兼容BASIC(嗯,sorta)。。我认为将类作为所有代码的根容器几乎是一种标准的面向对象思维方式。虽然我相信现在人们会插嘴说“语言怎么样?”(太好了,内默尔看起来很有趣。模块在c#中会非常棒。