Указатель на ссылочный тип - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д