Указатель на ссылочный тип - C#
Формулировка задачи:
Доброго времени суток, не могу разобраться с маленькой проблемой:
Имеется класс "Car" (его внутреннее содержимое не важно), мне необходимо объявить указатель на объект этого
класса в программе (для того чтобы выполнять манипуляции с ним, неважно какие). Для этого, я в настройках
свойств проекта разрешил небезопасный код, затем в методе "Main" объявил переменную-объект этого класса. После
чего использовал ключевое слово "unsafe" для указания начала небезопасного кода, и внутри его тела объявил
ключевое слово "fixed" (так как без него по теории невозможно объявлять указатели на ссылочный тип, ибо
ссылочный тип располагается в куче и может быть удален или перемещен в памяти в любой момент). И вот тут
выявляется ошибка компиляции "Невозможно получить адрес или размер или объявить указатель для управляемого
типа ("Unsafes.Car")". Вот мой код:
Немного поразмыслив, пришел к выводу, что myCar это ссылочный тип и в качестве его значения возвращается ссылка на адрес в памяти где находится объект. Поэтому решил что совсем не нужно выполнять операцию взятия адреса у объекта "myCar", так как его значение и есть адресс абъекта, а значит достаточно написать так:
Это дало другую ошибку "Неявное преобразование типа "Unsafes.Car" в "Unsafes.Car*" невозможно", по которой видно что C# по умолчанию автоматически разыменовывает ссылочный тип (отличается от типа указателя), что говорит о том что первоначальный пример, по сути, написан правильно.
Незнаю как быть, может у вас есть идеи ?
В заранее спасибо..
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(); } } }
fixed (Car* myCarPointer = myCar) // тут ошибка, ЗАМЕТЬТЕ отсутствие операции взятия адресса { // выполнить какие нибудь манипуляции.. }
Решение задачи: «Указатель на ссылочный тип»
textual
Листинг программы
int ksGetObjParam(int @ref, object param, int parType)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д