В чем разница между статическими методами в нестатическом классе и статическими методами в статическом классе? - PullRequest
37 голосов
/ 09 марта 2011

У меня есть два класса Class A и ClassB:

static class ClassA
{
    static string SomeMethod()
    {
        return "I am a Static Method";
    }
}

class ClassB
{
    static string SomeMethod()
    {
        return "I am a Static Method";
    }
}

Я хочу знать, в чем разница между ClassA.SomeMethod(); и ClassB.SomeMethod();

Когда они оба доступны безПри создании экземпляра класса, почему нам нужно создать статический класс, а не просто использовать нестатический класс и объявить методы как статические?

Ответы [ 5 ]

37 голосов
/ 09 марта 2011

Отличие только состоит в том, что статические методы в нестатическом классе не могут быть методами расширения .


Другими словами,это неверно:

class Test
{
    static void getCount(this ICollection<int> collection)
    { return collection.Count; }
}

, тогда как это действительно:

static class Test
{
    static void getCount(this ICollection<int> collection)
    { return collection.Count; }
}
14 голосов
/ 09 марта 2011

Статический класс может содержать только статические члены.

Статический метод гарантирует, что даже если вы создадите несколько объектов classB, они будут использовать только одну общую функцию SomeMethod.

Технически, нет никакой разницы, за исключением того, что SomeMethod ClassA должен быть статичным.

3 голосов
/ 19 сентября 2012

Если у вас есть нестатический класс, содержащий только статические методы, вы можете создать экземпляр этого класса. Но вы не можете использовать этот экземпляр осмысленно. Примечание: если вы не определяете конструктор, компилятор добавляет его для вас.

Статический класс не имеет конструктора, поэтому вы не можете создать его экземпляр. Также компилятор выдает ошибку, когда вы добавляете к нему метод экземпляра (где вы имели в виду статический метод).

См. Также документы .

3 голосов
/ 09 марта 2011
1 голос
/ 09 марта 2011

Статический метод принадлежит классу, а нестатический метод принадлежит объекту класса. То есть нестатический метод может быть вызван только для объекта класса, которому он принадлежит. Статический метод может получить доступ только к статическим членам. Нестатический метод может обращаться как к статическим, так и к нестатическим членам, потому что во время вызова статического метода класс может не быть создан (если он вызывается для самого класса). В другом случае нестатический метод может быть вызван только тогда, когда класс уже создан. Статический метод является общим для всех экземпляров класса. Всякий раз, когда метод вызывается в C ++ / Java / C #, неявный аргумент (ссылка «this») передается вместе с другими параметрами или без них. В случае статического вызова метода ссылка «this» не передается, поскольку статические методы принадлежат классу и, следовательно, не имеют ссылки «this».

...