2011-12-22 2 views
9

Когда вы создаете экземпляр класса, все переменные в этом экземпляре являются специфичными для этого экземпляра и убиваются, когда экземпляр выходит за рамки. Но как это работает в статическом методе? Предположим, что в одно и то же время два человека называют System.Math.Abs ​​(). Как среда выполнения различает двух абонентов? Это то, где происходит резьба? Созданы ли отдельные потоки автоматически для каждого абонента?Что происходит, когда вы вызываете статический метод в C#?

+1

Имеет ли [это] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) ответ на ваш вопрос? –

+4

.ToString не является статическим методом. –

+0

Эммануэль, я проверил сообщение, которое вы упомянули. Это касается моей озабоченности, но deosnt ответит на это :( – developer747

ответ

10

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

Единственное отличие здесь между экземпляром и статическим является то, что методы экземпляра имеют неявный параметр нулевого, иначе «это», то толкается абонентом (плюс некоторые виртуальной отправки и нуль-проверить удовольствие).

Для простоты я замазывание блоков итераторов, захваченные переменных и т.д.

+0

Спасибо, Марк! – developer747

6

Все статические члены класса существуют, даже если экземпляры класса не существуют. Они инициализируются когда-то до первого использования и очищаются, когда программа завершена.

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

Что касается того, как среда выполнения различает двух абонентов, это суть потоковой передачи. Каждый поток имеет свой собственный стек вызовов со своей собственной копией любых локальных переменных, параметров, обратного адреса и т. Д. Таким образом, два вызова не путаются и каждый возвращается к своему вызывающему абоненту правильно. Единственная проблема, опять же, заключается в том, что статический метод работает на статическом элементе, который не является потокобезопасным (или параметром, который не является потокобезопасным).

+0

Хорошее объяснение Джеймс. Спасибо. Как люди знают, что вы только что сказали мне? Не могли бы вы порекомендовать какую-нибудь хорошую книгу, в которой рассматриваются основные принципы? – developer747

+0

Большая часть этого я узнал только от моя BS в CompSci курсовая работа по теории языка программирования и самообучению языков программирования.Если вы действительно хотите получить подробную информацию, прочитайте C# Language Specification, она расскажет вам почти все, что нужно знать о реализации: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

Если бы вам пришлось порекомендовать одну из книг от вашего младшего (что касается таких основополагающих принципов), что бы это было? – developer747

12

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

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

Но как это работает в статическом методе?

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

Предположим, что два человека звонят System.Math.Abs ​​() точно в одно и то же время.

OK. Как вы это предлагаете?

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

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

Отдельные потоки автоматически создаются для каждого абонента?

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

Смежные вопросы