Подтвердить что ты не робот

Какова точка статического метода в нестационарном классе?

Мне трудно понять основные ошибки с помощью кода ниже:

class myClass
{
    public void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

class myOtherClass
{
    public static void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

public static class Test
{
    public static void Main()
    {
        myClass mc = new myClass();
        mc.print("hello");

        myOtherClass moc = new myOtherClass();
        moc.print("vhhhat?"); 
       //This says I can't access static method in non static context, but am I not?

    }
}

Я никогда не задумываюсь о причине, почему объявлял бы статический метод в нестационарном классе, поэтому почему .NET не будет генерировать ошибку исключения.

Кроме того,

moc.print("vhhhat?");

Это скажет, что я не могу получить доступ к статическому методу в нестационарном контексте, но Test и main являются статическими, что это значит?

4b9b3361

Ответ 1

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

myOtherClass.print("vhhhat?");

Это не статично, поскольку вы создали экземпляр класса moc:

myOtherClass moc = new myOtherClass();

Ответ 2

Это скажет, что я не могу получить доступ к статическому методу в нестационарном контексте, но Test и main являются статическими, что это значит?

Это относится к тому факту, что вы ссылаетесь на статический метод (myOtherClass.print), используя экземпляр (moc). Вам придется переработать это следующим образом:

myOtherClass.print("vhhhat?");

Это будет правильно составлено.

Статические методы - это методы, которые работают над самим классом, а не конкретным экземпляром класса. Это имеет много применений - один пример для реализации шаблона Factory.

Ответ 3

Во-первых, ошибка:

moc.print("vhhhat?");

пытается вызвать статический метод для экземпляра класса (т.е. нестатического контекста). Чтобы правильно вызвать print(), вы сделали бы

myOtherClass.print("vhhhat?");

Для первого вопроса есть много причин, чтобы статические методы выполнялись в нестационарном классе. В принципе, если есть операция, связанная с классом, но не с каким-либо конкретным экземпляром класса, это должен быть статический метод. Например, String.Format() (или любой из статических методов String) не должны работать со строковыми экземплярами, но они должны быть связаны с классом String. Поэтому они являются статическими.

Ответ 4

Когда-то "объектная" функция специфична для класса, а не для объекта (экземпляр класса).

Например, метод factory:

SomeClass obj = SomeClass.CreateInstance();

Это более очевидно, когда язык обладает средствами метапрограммирования, которые позволяют выполнять операции над классами. В Python это различие делается более явным по соглашению: первый параметр, переданный функции, называется либо "cls", либо "self" и указывает, что функция может работать в классе (когда это "метод класса" ) или экземпляр (тип, к которому вы больше привыкли, когда это метод экземпляра).

Ответ 6

Когда вы вызываете метод в экземпляре объекта, вы вызываете его в нестационарном контексте. Это не имеет никакого значения, в каком методе вы это делаете.