Как да използвам управлявани указатели в C #

Указателят е променлива, която сочи към адреса на друга променлива. С други думи, указателят съдържа адреса на паметта на друга променлива или местоположение в паметта. Доскоро единственият начин за работа с указатели в C # беше използването на небезопасен код. Можете да се възползвате от unsafe ключовата дума, за да дефинирате опасен контекст и след това да създадете неуправлявани указатели или да извикате собствени функции, използвайки неуправлявани указатели.

Тук трябва да се отбележи, че небезопасният код предполага код, който се изпълнява извън контекста на CLR. Това е неуправляван код. Тъй като обаче изключвате безопасността, предоставена от CLR по подразбиране, препоръчително е да използвате опасен код само ако сте наясно как работи управлението на паметта в .Net.

Препратката към обект в C # е безопасен за тип указател, който сочи към началото на обект. Има друг тип указател в CLR, известен като управляван указател. Тази статия разглежда какво представляват управляваните указатели, защо са полезни и как можем да работим с тях в C #.

Обяснени са управлявани указатели в C #

Управляваният указател се различава от типовия указател по това, че може да сочи към други места на обект, т.е. Подобно на препратка към обект, управляваният указател може да сочи към обекти, съхранявани в управляваната купчина. Разликата е, че докато препратката към обект сочи към началото на обекта, управляваният указател може да сочи към параметри на метода, полета, елементи на масива или всяка друга част от обекта.

По същество управляваният указател може да сочи следното:

  • локална променлива
  • елемент от масив
  • параметър на метод
  • поле от сложен тип

Управляваните указатели не поддържат директно аритметика на показалеца. Не можете да „добавяте“ или „изваждате“ стойностите на адресите, към които сочат. Не можете да поставите стойност на управляван указател. Очевидно именно поради тези ограничения управляваните указатели не са изрично изложени на езика C #. Управляваните указатели обаче са имплицитни в C # от дълго време като референтни параметри. Когато предавате параметър на метод чрез препратка, вие използвате управляван указател зад кулисите.

10 правила за използване на управлявани указатели в C #

Обърнете внимание на следните точки върху управляваните указатели.

  1. Управляваните указатели не могат да бъдат нула.
  2. Не е възможно управляван указател да сочи към друг управляван указател.
  3. Управляваните указатели не могат да бъдат в купчината.
  4. Не можете да обменяте управляван указател с препратка към обект.
  5. Не можете да съхранявате управлявани указатели в статични променливи или като елементи на масив или поле.
  6. Не можете да използвате управлявани указатели като тип елемент на масив.
  7. Управляваният указател може да сочи към препратка към обект или тип стойност.
  8. Ако предадете параметър на метод като препратка, аргументът всъщност е управляван указател.
  9. Управляваните указатели също се наричат ​​byref типове.
  10. Управляваният указател може да сочи към локална променлива на метод или параметър на метод.

Предайте аргумент чрез препратка в C #

Добре, достатъчно са ни концепциите. Нека сега напишем малко код, за да разберем управляваните указатели. Можете да използвате ref параметри, ref местни или ref връщания, за да представите управляван указател. Нека разгледаме всеки един от тях един по един.

Помислете за следната структура, която съдържа само един член, целочислена променлива.

публична структура MyStruct

{

   публичен int MyField;

}

Следващият метод актуализира стойността на члена на данните MyField на екземпляр на MyStruct.

частна статична невалидна актуализация (справка с MyStruct данни)

{

   data.MyField = 5;

}

Следният кодов фрагмент илюстрира как можете да предадете аргумент чрез препратка вместо стойност.

public int Main ()

{

  MyStruct obj = нов MyStruct ();

  obj.MyField = 1;

  Актуализация (ref obj);

  Console.WriteLine (obj.MyField);

  Console.Read ();

}

Можете да се възползвате от структурите вместо класове, за да избегнете разпределението на купчина и режийните разходи за копиране на данни. Това е добър трик за оптимизация, който може да се използва за структури, които имат малко членове на данни.

Когато изпълнявате горната програма, в прозореца на конзолата се показва „5“.

Използвайте ref local за съхраняване на управляван указател в C #

Можете също да използвате ref local, за да съхранявате управляван указател. Следният кодов фрагмент илюстрира как това може да се постигне. Обърнете внимание на използването на ключовата дума ref от двете страни на заданието.

публична статична празнота UpdateDataUsingRefLocal (MyStruct данни)

  {

     ref int refLocal = ref данни.MyField;

     refLocal = 10;

  }

Можете да се възползвате от ref return, за да върнете променлива от метод, който представлява управляван указател. Имайте предвид, че това не може да бъде локална променлива, т.е. не можете да върнете локална променлива, която представлява управляван указател. Опитът за връщане на локална променлива ще доведе до грешка в компилацията.

Следният кодов фрагмент илюстрира как може да се използва ref return.

обществен статичен ref int GetMarksByRef (int [] марки, int subjectIndex)

{

  връща реф марки [subjectIndex];

}

Докато препратката към обект сочи към началото на обект, управляваният указател може да сочи вътре в обект, към поле от тип или към елемент от масив. Интересно е да се знае как управляваните указатели работят зад кулисите. Ще обсъдя как управляваните указатели работят по-подробно в следваща публикация тук.