Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.39 KB | None | 0 0
  1. # Связь между сборками и пространством имен
  2. В разных сборках могут быть одинаковые пространства имен, открыв один такой namespace, будут доступны типы из разных сборок
  3.  
  4. # Как разные компоненты взаимодействуют во время выполнения
  5. При исполнении программы у каждого потока есть свой стек, его размер - 1МБ
  6. В процессе выполнения программы в этот стек помещаются разлиные значения переменных и полей, например при вызове метода T1:
  7. ```csharp
  8. public int T()
  9. {
  10. var v = "q";
  11. T1(v);
  12. return 1;
  13. }
  14.  
  15. private void T1(string q)
  16. {
  17. Console.WriteLine(q);
  18. }
  19. ```
  20. В стеке находятся:
  21. ...
  22. * переменная v
  23. * аргумент метода T1 q
  24. * адрес возврата из функции T1 в функцию T
  25.  
  26. тем самым, когда мы выходим из метода T1 стек становится таким:
  27. ...
  28. * переменная v
  29.  
  30. Все записи относящиеся к методу T1 из стека извлекаются
  31.  
  32. Это происходит в стеке, в куче же создаются ссылочные типы и выделяется память под их экземпляры. При первом обращении к типу,нужно
  33. создать его представление в куче, таблицу методов, по которой можно определить все методы, которые декларирует тип. Два обязательных элемента у каждого жителя кучи - индекс синхронизации(нужен CLR) и указать на тип. Указатель на тип нужен для определения типов у экземпляров объектов, например у экземпляра класса Employee, будет ссылка на тип Employee(это тоже объект в куче), самое интересное, что у Employee тоже существует ссылка на на объект типа - это тип Type, а у типа Type эта ссылка указывает на самого себя.Также кроме таблицы методов в типе будут находиться все статические члены типа, потому что они определяеются только один раз. Все типы загружаются в момент надобности(обращения к ним), отследить загрузку можно поставиви break point в статическом ctor'e.
  34.  
  35. Все экзмпляры хранятся в куче, выделяя место для своих полей(нестатических), причем CLR изначально инициализирует все поля значениями по умолчанию, и уже после вызова конструктора они инициализируются, вызов конструтора возвращает указатель на расположение объекта в памяти.
  36.  
  37. Также нужно отметить, что вызовы виртуальных/невиртуальных и статических методов в среде CLR различаются, при вызове статических и
  38. невиртуальных методов CLR смотрит тип объекта и находит метод в таблице методов объекта типа(если не нашел там, то просмотрит базовый тип объекта, ссылка на него также хранится в куче, далее, при необходимости JIT компилятор
  39. преобразует CLR код в машинные команды, и выполняет их
  40.  
  41. В случае виртуального метода все сложнее, дело в том, что он может быть переопределен в наследнике, поэтому CLR необходимо
  42. знать реальный тип объекта, а не декларируемый, поэтому он обращается к переменной на которой вызывается метод, находит его тип,
  43. а после этого начинает искать в таблице методов вызываемый метод
  44.  
  45. В случае невиртуального метода происходит поиск по декларируемому типу переменной, для этого типа происходит поиск по таблице
  46. методов, выбирается нужный и вызывается(или JIT компилятор)
  47.  
  48. Кстати вызов метода GetType возвращает указатель на тип объекта, тип объекта в системе создается лишь один раз => вызов метода GetType на разных экземплярах одного типа возвращает тот же самый объект
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement