Указатель на ссылочный тип - 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)