Когда вы создаете экземпляр класса, все переменные в этом экземпляре являются специфичными для этого экземпляра и убиваются, когда экземпляр выходит за рамки. Но как это работает в статическом методе? Предположим, что в одно и то же время два человека называют System.Math.Abs (). Как среда выполнения различает двух абонентов? Это то, где происходит резьба? Созданы ли отдельные потоки автоматически для каждого абонента?Что происходит, когда вы вызываете статический метод в C#?
ответ
Не существует реальной разницы между статическими и нестационарными методами в терминах времени жизни метода. В обоих случаях в качестве детали реализации, местные жители обычно (не совсем всегда: есть исключения), выделенные в стеке. Стек является потоком, поэтому локальные переменные метода не пересекаются между потоками.
Единственное отличие здесь между экземпляром и статическим является то, что методы экземпляра имеют неявный параметр нулевого, иначе «это», то толкается абонентом (плюс некоторые виртуальной отправки и нуль-проверить удовольствие).
Для простоты я замазывание блоков итераторов, захваченные переменных и т.д.
Спасибо, Марк! – developer747
Все статические члены класса существуют, даже если экземпляры класса не существуют. Они инициализируются когда-то до первого использования и очищаются, когда программа завершена.
Если у вас было два одновременных вызова статического метода, они будут работать с одной и той же копией любых статических членов класса (если они их используют). Поэтому, если статический метод работает с статическим членом (или параметром), он должен делать это безопасным потоком. Если статический метод работает только на локалях, то сам метод обычно является потокобезопасным.
Что касается того, как среда выполнения различает двух абонентов, это суть потоковой передачи. Каждый поток имеет свой собственный стек вызовов со своей собственной копией любых локальных переменных, параметров, обратного адреса и т. Д. Таким образом, два вызова не путаются и каждый возвращается к своему вызывающему абоненту правильно. Единственная проблема, опять же, заключается в том, что статический метод работает на статическом элементе, который не является потокобезопасным (или параметром, который не является потокобезопасным).
Хорошее объяснение Джеймс. Спасибо. Как люди знают, что вы только что сказали мне? Не могли бы вы порекомендовать какую-нибудь хорошую книгу, в которой рассматриваются основные принципы? – developer747
Большая часть этого я узнал только от моя BS в CompSci курсовая работа по теории языка программирования и самообучению языков программирования.Если вы действительно хотите получить подробную информацию, прочитайте C# Language Specification, она расскажет вам почти все, что нужно знать о реализации: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –
Если бы вам пришлось порекомендовать одну из книг от вашего младшего (что касается таких основополагающих принципов), что бы это было? – developer747
При создании экземпляра класса, все переменные, специфичной для данного экземпляра был убит, когда экземпляр находится вне объем.
Переменные - обычно называемое «поле» будут высвобождены послежизни экземпляра. Область - область текста программы, в которой компилятор распознает что-то по его названию; liftime - часть времени, в течение которого место хранения является действительным. Сфера охвата и продолжительность жизни часто путают.
Но как это работает в статическом методе?
Статические поля имеют неограниченное время жизни; место хранения создается за какое-то время до того, как поле будет доступно и не будет уничтожено до тех пор, пока приложение не будет снесено.
Предположим, что два человека звонят System.Math.Abs () точно в одно и то же время.
OK. Как вы это предлагаете?
Каким образом среда выполнения отличается между двумя абонентами? Это то, где происходит резьба?
Статический метод превращается в кучу машинных команд, которые являются числами в памяти. Каждый поток выполнения имеет связанный с ним номер, называемый указателем инструкции, который находит текущую инструкцию. Два разных потока могут одновременно иметь указатели указателей, которые находятся внутри одного и того же статического метода одновременно.
Отдельные потоки автоматически создаются для каждого абонента?
Вопрос не имеет никакого смысла. Как вы получили двух вызывающих абонентов в то же время, если они еще не были в отдельных потоках?
- 1. Что происходит, когда вы вызываете объект .__ new__?
- 2. Что происходит, когда вы вызываете прерывание потока()?
- 3. Когда вы вызываете, что я могу сделать, вы вызываете только статический метод?
- 4. Что происходит внутри, когда вы вызываете функцию в php
- 5. В C#, что происходит, когда вы вызываете метод расширения на нулевом объекте?
- 6. Что происходит, когда вы вызываете cudaMalloc внутри устройства?
- 7. Магистраль, что происходит, когда вы вызываете render() mupliple times
- 8. Что происходит, когда вы вызываете программу с терминала?
- 9. Что происходит, когда вы вызываете malloc на существующую переменную?
- 10. Что происходит, когда вы вызываете структуру, содержащую тип перечисления?
- 11. Когда вы вызываете WaveExtensionMethods?
- 12. Когда вы вызываете encodeWithCoder?
- 13. Что происходит, когда вы вызываете метод переопределения, используя супер и это ключевое слово?
- 14. Что происходит, когда вы разыскиваете постинктекс C
- 15. Что происходит, когда вы инициализируете параметр? C++
- 16. Что происходит, когда вы открываете/закрываете ручку?
- 17. Что происходит, если вы вызываете конструктор из деструктора?
- 18. Как вы вызываете метод в Nashorn CompiledScript?
- 19. Что происходит, когда вы вызываете include в отношении/коллекции в Rails?
- 20. Что происходит, когда вы делаете GetType()?
- 21. Что происходит, когда вы вызываете данные() на std :: vector <bool>?
- 22. Когда именно вы вызывается в Backbone.js, когда вы вызываете Collection.create?
- 23. Как вы вызываете метод с любой сигнатурой динамически в C#?
- 24. Что происходит, когда вы устанавливаете метод после объекта?
- 25. Что происходит, когда вы вызываете setter/getter на свойство, которое не было alloc + init'ed?
- 26. Что происходит, когда вы логически не плаваете?
- 27. Когда вы вызываете оператор sizeof в вызываемой функции, что произойдет?
- 28. Что произойдет внутри, когда вы вызываете getSystemService (WIFI_SERVICE) в android?
- 29. Что происходит, когда вы возвращаетесь в браузер?
- 30. Как остановить метод при запуске, когда вы вызываете другой?
Имеет ли [это] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) ответ на ваш вопрос? –
.ToString не является статическим методом. –
Эммануэль, я проверил сообщение, которое вы упомянули. Это касается моей озабоченности, но deosnt ответит на это :( – developer747