исправлено ключевое слово для блокировки переменной ссылочного типа в памяти из небезопасного контекста? - PullRequest
0 голосов
/ 05 июня 2019

Ниже приведен код без использования исправлений при работе с типом указателя:

class PointRef 
{
   public int x;
}

public unsafe static void UseAndPinPoint() 
{
   PointRef pt = new PointRef { x = 5 };
   int* p = &pt.x;
   ... Use int* variable here!
   Console.WriteLine("Point is: {0}", pt);
}

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

Я не совсем понял, в примере. не означает, что pt всегда указывает на объект, на который имеется ссылка (если мы не переназначим pt для указания на другой объект PointRef как pt = new PointRef { x = 1 };), поэтому объект не будет собираться мусором до тех пор, пока метод UseAndPinPoint () не завершится.

1 Ответ

0 голосов
/ 05 июня 2019

pt.x - это фиксированная переменная , вам нужно использовать только оператор fixed для подвижной переменной , все это совершенно ясно в документации

Фиксированные и перемещаемые переменные

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

Оператор & (оператор address-of) позволяет получить адрес фиксированной переменной без ограничений .Однако поскольку перемещаемая переменная подлежит перемещению или удалению сборщиком мусора, адрес подвижной переменной можно получить только с помощью фиксированного оператора (фиксированный оператор), и этот адрес остается действительным только дляпродолжительность этого фиксированного оператора.

Точнее говоря, фиксированная переменная - это одно из следующего:

  1. Переменная, полученная из simple_name (Простые имена), которая ссылается на локальныйпеременная или параметр значения, если переменная не захвачена анонимной функцией.
  2. Переменная, полученная в результате member_access (доступ к элементу) формы VI, где V - фиксированная переменная типа struct_type .
  3. Переменная, полученная в результате pointer_indirection_expression (косвенное указание) в форме * P, pointer_member_access (доступ к элементу Pointer) в форме P-> I или pointer_element_access (доступ к элементу Pointer) объектаформа P [E].

Все остальные переменные классифицируются как moпеременные.

...