Почему статические методы должны быть заключены в класс? - PullRequest
8 голосов
/ 15 ноября 2011

Извините за неграмотность этого вопроса.Если есть простой ответ, просто ссылка на объяснение сделает меня более чем счастливым.

После 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(); 
    }
} 

Мой вопрос:Почему необходимо обернуть эти статические методы в статический класс?Кажется, не имеет смысла.Есть ли способ, которым я могу иметь эти методы самостоятельно, не обернутые в класс?Я знаю, что инкапсуляция полезна, но я не вижу использования статических методов в статическом классе.Есть что-то, что я пропускаю стилистически или иначе?Я полностью лаю на глупое дерево?Я слишком много думаю?

Ответы [ 5 ]

7 голосов
/ 15 ноября 2011

В 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 методами расширения.

2 голосов
/ 15 ноября 2011

Этот пост Эрика Липперта дает довольно подробное объяснение.Я не уверен, знает ли этот парень "Эрик", о чем он говорит, или нет; -)

1 голос
/ 15 ноября 2011

Было бы несколько неловко иметь методы, просто болтающиеся в случайном пространстве имен.

Я подозреваю, что ответ заключается в предоставлении "охвата". Тот факт, что метод является статическим, не означает, что он не имеет области действия. Он по-прежнему может обращаться к другим статическим закрытым методам или переменным-членам - и класс предоставляет «дом» для этих вещей.

Статические классы также могут иметь статические конструкторы, которые вызываются при первом использовании статического метода, так что это дает возможность устанавливать вещи по мере необходимости.

Это скорее организационный дизайн, чем что-либо из-за технических ограничений.

0 голосов
/ 15 ноября 2011

уже есть много тем на эту тему, в которых достаточно информации ... вы можете найти один здесь ..

0 голосов
/ 15 ноября 2011

Статический метод - это метод, вызываемый в одном экземпляре класса, который создается во время выполнения.

...