Указатель на ссылочный тип - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, не могу разобраться с маленькой проблемой: Имеется класс "Car" (его внутреннее содержимое не важно), мне необходимо объявить указатель на объект этого класса в программе (для того чтобы выполнять манипуляции с ним, неважно какие). Для этого, я в настройках свойств проекта разрешил небезопасный код, затем в методе "Main" объявил переменную-объект этого класса. После чего использовал ключевое слово "unsafe" для указания начала небезопасного кода, и внутри его тела объявил ключевое слово "fixed" (так как без него по теории невозможно объявлять указатели на ссылочный тип, ибо ссылочный тип располагается в куче и может быть удален или перемещен в памяти в любой момент). И вот тут выявляется ошибка компиляции "Невозможно получить адрес или размер или объявить указатель для управляемого типа ("Unsafes.Car")". Вот мой код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Unsafes
  7. {
  8. class Car
  9. {
  10. public string name;
  11. public int age;
  12. public Car(string name, int age)
  13. {
  14. this.name = name;
  15. this.age = age;
  16. }
  17. public override string ToString()
  18. {
  19. return string.Format("[name = {0}; age = {1}]", name, age);
  20. }
  21. }
  22. class Program
  23. {
  24. static void Main(string[] args)
  25. {
  26. Car myCar = new Car("Suzuki Liana", 8);
  27. Console.WriteLine(myCar);
  28. unsafe
  29. {
  30. fixed (Car* myCarPointer = &myCar) // тут ошибка
  31. {
  32. // выполнить какие нибудь манипуляции..
  33. }
  34. }
  35. Console.ReadLine();
  36. }
  37. }
  38. }
Немного поразмыслив, пришел к выводу, что myCar это ссылочный тип и в качестве его значения возвращается ссылка на адрес в памяти где находится объект. Поэтому решил что совсем не нужно выполнять операцию взятия адреса у объекта "myCar", так как его значение и есть адресс абъекта, а значит достаточно написать так:
Листинг программы
  1. fixed (Car* myCarPointer = myCar) // тут ошибка, ЗАМЕТЬТЕ отсутствие операции взятия адресса
  2. {
  3. // выполнить какие нибудь манипуляции..
  4. }
Это дало другую ошибку "Неявное преобразование типа "Unsafes.Car" в "Unsafes.Car*" невозможно", по которой видно что C# по умолчанию автоматически разыменовывает ссылочный тип (отличается от типа указателя), что говорит о том что первоначальный пример, по сути, написан правильно. Незнаю как быть, может у вас есть идеи ? В заранее спасибо..

Решение задачи: «Указатель на ссылочный тип»

textual
Листинг программы
  1. int ksGetObjParam(int @ref, object param, int parType)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы