Почему нам не нужно вызывать статические методы через объект? - PullRequest
0 голосов
/ 26 мая 2011
public static void callit(ref int var)  
{  
   var++;  
}  
public static void main(Object sender, EventArgs e)  
{  
   int num=6;  
   callit(ref num);  
   Console.WriteLine(num);  
}

Но если бы здесь метод callit () не был статическим, то мне пришлось бы создать объект класса, а затем вызвать его.

Ответы [ 9 ]

3 голосов
/ 26 мая 2011

Это верно.Нестатические методы должны вызываться для экземпляра объекта.Даже если метод на самом деле не использует каких-либо других членов объекта, компилятор все равно применяет правило, согласно которому методы экземпляров требуют экземпляров.С другой стороны, статические методы не нужно вызывать в экземпляре. Вот что делает их статичными.

2 голосов
/ 26 мая 2011

Именно потому, что в этом весь смысл статических методов.

Методы экземпляра должны знать, в каком экземпляре класса вы вызываете метод.переменные в классе.

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

class.StaticMethod();

Примером этого может быть:

public class ExampleClass
{
    public int InstanceNumber { get; set; }

    public static void HelpMe()
    {
        Console.WriteLine("I'm helping you.");
        // can't access InstanceNumber, which is an instance member, from a static method.
    }

    public int Work()
    {
        return InstanceNumber * 10;
    }
}

Вы можете создать экземпляр этого класса, чтобы вызвать метод Work() для этого конкретного экземпляра

var example = new ExampleClass();
example.InstanceNumber = 100;
example.Work();

Хотя ключевое слово static,означает, что вам не нужна ссылка на экземпляр для вызова метода HelpMe(), поскольку он привязан к классу, а не к конкретному экземпляру класса

ExampleClass.HelpMe();
1 голос
/ 26 мая 2011

Это просто вопрос синтаксиса C #, если я правильно понимаю ваш вопрос.В вашем примере нет никакой двусмысленности в использовании callit(ref num);.Точно известно, какой метод вызывать, поскольку это статический метод, и к нему не прикреплен объект.С другой стороны, если бы callit не было статическим, компилятор не знал бы объект, для которого вызывается метод, поскольку вы вызываете его из статического метода (у которого нет объекта).Итак, вам нужно создать новый объект и вызвать метод для этого объекта.

Конечно, если ни один из методов не является статическим, вызов метода будет работать сам по себе, и снова объект будет известен такнет проблем.

1 голос
/ 26 мая 2011

Я думаю, что MSDN объясняет это очень хорошо

Static classes and class members are used to create data and functions that can be accessed without creating an instance of the class. Static class members can be used to separate data and behavior that is independent of any object identity: the data and functions do not change regardless of what happens to the object. Static classes can be used when there is no data or behavior in the class that depends on object identity.

Вы можете найти более подробную информацию по этой теме здесь

0 голосов
/ 26 мая 2011

Статический метод не зависит от экземпляра, предположим, что есть класс man, в котором есть метод eat, который не является статическим, и есть метод sleep, который является статическим, тогда, когда вы создаете другой экземпляр man, скажем, man m1, m2.m1 и m2 используют одни и те же методы сна, но разные методы питания.В java все статические переменные хранятся в памяти кучи, которая используется всеми экземплярами объекта во время выполнения, если статическая переменная изменится, тогда она будет делиться на все экземпляры объекта в наших case.m1 и m2.Но если вы измените нестатическую переменную, это будет только для этого экземпляра объекта

m1.anStaticvariable = 1;// также изменяет значение m2.anStaticvariable, но m1.nonStaticvariable = 1;// не изменим m2.nonStaticvariable

Надеюсь, это поможет вам

0 голосов
/ 26 мая 2011

Статические функции обращаются к переменным класса, которые так же доступны любым другим статическим функциям И функциям экземпляра. Это означает, что если у вас есть переменная класса с именем static int count, в статическом методе static increaseCount() { count++; } увеличивается переменная count на 1, а в статическом методе static decreaseCount() { count--; } уменьшается переменная count на 1.

Следовательно, и статическая функция, и функция экземпляра могут обращаться к статической переменной, но статическая функция НЕ МОЖЕТ обращаться к переменной экземпляра.

Статические функции также называются функциями класса. Нестатические функции также называются функциями экземпляра.

0 голосов
/ 26 мая 2011

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

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

0 голосов
/ 26 мая 2011

Статические функции работают на классах.Функции-члены работают с экземплярами.

И да, вы можете вызвать только функцию-член объекта (экземпляра).Нет экземпляра, нет члена.

0 голосов
/ 26 мая 2011

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

...