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

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

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

Доброго времени суток, не могу разобраться с маленькой проблемой: Имеется класс "Car" (его внутреннее содержимое не важно), мне необходимо объявить указатель на объект этого класса в программе (для того чтобы выполнять манипуляции с ним, неважно какие). Для этого, я в настройках свойств проекта разрешил небезопасный код, затем в методе "Main" объявил переменную-объект этого класса. После чего использовал ключевое слово "unsafe" для указания начала небезопасного кода, и внутри его тела объявил ключевое слово "fixed" (так как без него по теории невозможно объявлять указатели на ссылочный тип, ибо ссылочный тип располагается в куче и может быть удален или перемещен в памяти в любой момент). И вот тут выявляется ошибка компиляции "Невозможно получить адрес или размер или объявить указатель для управляемого типа ("Unsafes.Car")". Вот мой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Unsafes
{
    class Car
    {
        public string name;
        public int age;
 
        public Car(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
 
        public override string ToString()
        {
            return string.Format("[name = {0}; age = {1}]", name, age);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Car myCar = new Car("Suzuki Liana", 8);
 
            Console.WriteLine(myCar);
 
            unsafe
            {
                fixed (Car* myCarPointer = &myCar)    // тут ошибка
                {
                    // выполнить какие нибудь манипуляции..
                }
            }
            
            Console.ReadLine();
        }
    }
}
Немного поразмыслив, пришел к выводу, что myCar это ссылочный тип и в качестве его значения возвращается ссылка на адрес в памяти где находится объект. Поэтому решил что совсем не нужно выполнять операцию взятия адреса у объекта "myCar", так как его значение и есть адресс абъекта, а значит достаточно написать так:
fixed (Car* myCarPointer = myCar)    // тут ошибка, ЗАМЕТЬТЕ отсутствие операции взятия адресса
    {
        // выполнить какие нибудь манипуляции..
    }
Это дало другую ошибку "Неявное преобразование типа "Unsafes.Car" в "Unsafes.Car*" невозможно", по которой видно что C# по умолчанию автоматически разыменовывает ссылочный тип (отличается от типа указателя), что говорит о том что первоначальный пример, по сути, написан правильно. Незнаю как быть, может у вас есть идеи ? В заранее спасибо..

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

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

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


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

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

8   голосов , оценка 4.125 из 5
Похожие ответы