Programování

Jak používat spravované ukazatele v C #

Ukazatel je proměnná, která ukazuje na adresu jiné proměnné. Jinými slovy, ukazatel obsahuje adresu paměti jiné proměnné nebo umístění paměti. Až donedávna bylo jediným způsobem práce s ukazateli v C # používání nebezpečného kódu. Mohli byste využít výhod nebezpečný klíčové slovo k definování nebezpečného kontextu a poté vytvoření nespravovaných ukazatelů nebo vyvolání nativních funkcí pomocí nespravovaných ukazatelů.

Zde je třeba poznamenat, že nebezpečný kód implikuje kód, který se provádí mimo kontext CLR. Je to nespravovaný kód. Protože však ve výchozím nastavení vypínáte zabezpečení poskytované modulem CLR, je vhodné použít nebezpečný kód, pouze pokud víte, jak funguje správa paměti v .Net.

Odkaz na objekt v C # je typově bezpečný ukazatel, který ukazuje na začátek objektu. V CLR existuje jiný typ ukazatele známý jako spravovaný ukazatel. Tento článek zkoumá, co jsou spravované ukazatele, proč jsou užitečné a jak s nimi můžeme pracovat v C #.

Vysvětlení spravovaných ukazatelů v C #

Spravovaný ukazatel se liší od ukazatele bezpečného pro typ tím, že je schopen ukazovat na jiná umístění objektu, tj. Nejen na začátek objektu. Stejně jako odkaz na objekt může spravovaný ukazatel ukazovat na objekty uložené ve spravované haldě. Rozdíl je v tom, že zatímco odkaz na objekt odkazuje na začátek objektu, spravovaný ukazatel může ukazovat na parametry metody, pole, prvky pole nebo jakoukoli jinou část objektu.

V podstatě může spravovaný ukazatel ukazovat na následující:

  • místní proměnná
  • prvek pole
  • parametr metody
  • pole složeného typu

Spravované ukazatele přímo nepodporují aritmetiku ukazatele. Hodnoty adres, na které odkazují, nemůžete „sčítat“ ani „odečíst“. Nelze orámovat hodnotu spravovaného ukazatele. Je zřejmé, že kvůli těmto omezením nejsou spravované ukazatele explicitně vystaveny v jazyce C #. Spravované ukazatele však byly v C # implicitní po dlouhou dobu jako referenční parametry. Když předáte parametr metodě odkazem, používáte spravovaný ukazatel v zákulisí.

10 pravidel pro používání spravovaných ukazatelů v C #

U spravovaných ukazatelů si všimněte následujících bodů.

  1. Spravované ukazatele nemohou mít hodnotu null.
  2. Není možné, aby spravovaný ukazatel směřoval na jiný spravovaný ukazatel.
  3. Spravované ukazatele nemohou být na haldě.
  4. Spravovaný ukazatel nemůžete vyměnit s odkazem na objekt.
  5. Spravované ukazatele nelze ukládat do statických proměnných nebo jako prvky pole nebo pole.
  6. Spravované ukazatele nelze použít jako typ prvku pole.
  7. Spravovaný ukazatel může ukazovat na odkaz na objekt nebo na typ hodnoty.
  8. Pokud předáte parametr metody jako odkaz, argument je ve skutečnosti spravovaný ukazatel.
  9. Spravované ukazatele se také označují jako typy byref.
  10. Spravovaný ukazatel může ukazovat na lokální proměnnou metody nebo parametr metody.

Předat argument odkazem v C #

Dobře, těch konceptů už máme dost. Pojďme nyní napsat nějaký kód, abychom porozuměli spravovaným ukazatelům. K reprezentaci spravovaného ukazatele můžete použít parametry ref, ref locals nebo ref returns. Pojďme prozkoumat každý z nich jeden po druhém.

Zvažte následující strukturu, která obsahuje pouze jednoho člena, celočíselnou proměnnou.

veřejná struktura MyStruct

{

public int MyField;

}

Následující metoda aktualizuje hodnotu MyField datového člena instance MyStruct.

Aktualizace soukromé statické neplatnosti (ref MyStruct data)

{

data.MyField = 5;

}

Následující fragment kódu ukazuje, jak můžete předat argument odkazem místo hodnoty.

public int Main ()

{

MyStruct obj = new MyStruct ();

obj.MyField = 1;

Aktualizovat (ref obj);

Console.WriteLine (obj.MyField);

Console.Read ();

}

Místo tříd můžete využít výhod struktur, abyste se vyhnuli alokaci haldy a režii kopírování dat. Toto je dobrý optimalizační trik, který lze použít pro struktury, které mají několik datových členů.

Po spuštění výše uvedeného programu se v okně konzoly zobrazí „5“.

Použijte ref local k uložení spravovaného ukazatele v C #

Můžete také použít ref local k uložení spravovaného ukazatele. Následující fragment kódu ukazuje, jak toho lze dosáhnout. Všimněte si použití klíčového slova ref na obou stranách úkolu.

public static void UpdateDataUsingRefLocal (data MyStruct)

  {

ref int refLocal = ref data.MyField;

refLocal = 10;

  }

Můžete využít výhod ref returns k vrácení proměnné z metody, která představuje spravovaný ukazatel. Všimněte si, že to nemůže být lokální proměnná, tj. Nemůžete vrátit lokální proměnnou, která představuje spravovaný ukazatel. Pokus o vrácení místní proměnné bude mít za následek chybu kompilace.

Následující fragment kódu ukazuje, jak lze použít ref ref.

public static ref int GetMarksByRef (značky int [], int subjectIndex)

{

vrácení referenčních značek [subjectIndex];

}

Zatímco odkaz na objekt odkazuje na začátek objektu, spravovaný ukazatel může ukazovat uvnitř objektu, na pole typu nebo na prvek pole. Je zajímavé vědět, jak spravované ukazatele fungují v zákulisí. Jak spravované ukazatele fungují podrobněji v dalším příspěvku zde, budu diskutovat zde.

$config[zx-auto] not found$config[zx-overlay] not found