简体   繁体   中英

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

Sorry for the unlearned nature of this question. If there's a simple answer, just a link to an explanation will make me more than happy.

After 6 months programming I find static classes to be somewhat useful for storing routines that apply to many different classes. Here's a simplified example of how I use static classes, it's a class for parsing text into various things

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; 
    }
}

And I use this in obvious ways like

    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(); 
    }
} 

My question is: Why is it necessary to wrap these static methods in a static class? It seems to serve no purpose. Is there a way I can have these methods on their own not wrapped in a class? I know encapsulation is beneficial but I don't see the use for static methods wrapped in static class. Is there something I am missing stylistically or otherwise? Am I completely barking up a silly tree? Am I thinking too much?

In C#, any method has to be declared inside a class. That's just how the language is specified.

A static class is actually more akin to a module than a class, so I too think you should be able to either:

  • define a function outside a class or;
  • import a module the same way you import a namespace (with using )

VB.NET, F# and Nemerle actually allow you to declare modules and import them; what allows you to use their methods unqualified.

This is valid Nemerle:

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

Also, take a look at extension methods , they might allow you to "solve" this in a different way. The methods in your TextProcessor are begging to be string extension methods.

This post by eric lippert gives a pretty detailed explanation. I'm not sure if this guy "eric" knows what he's talking about or not though ;-)

It would be somewhat awkward to have methods just dangling around in a random namespace.

I suspect the answer is to provide "scope". Just because a method is static, doesn't mean it doesn't have a scope. It can still access other static private methods or member variables - and the class provides a "home" for these things to live in.

Static classes can also have static constructors that get called the first time a static method is used, so this provides the ability to set stuff up as needed.

It's more of an organizational design than anything to due with technical limitations.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM