Указатели на класс корневого типа в C # - PullRequest
1 голос
/ 27 апреля 2011

Я новичок в C # и не знаю, как реализовать интерфейсы указателей для типов классов, которые я определяю. Это очень легко сделать в C ++ (хотя я не делал это с колледжа) или C (где я делаю это все время), но у меня возникают проблемы с ошибками в C #.

Это понятнее в примере. Предположим, вы хотите реализовать семейное древо:

class person{
   person* mom;
   person* dad;
   string Name;
   string Birthdate;     

   person[] children;


//...constructors, destructors, methods etc...
}

VS2010 Сообщает мне, что "Невозможно объявить указатель на управляемый тип" Я не хочу знать о хороших реализациях для такого рода проблем (поскольку я буду делать структуру совершенно нестандартной, а не что-то вроде дерева), просто как объявлять указатели на объекты типа, который содержит указатель ( в C #) Это неправильный способ использования класса?

Ответы [ 5 ]

3 голосов
/ 27 апреля 2011

Удалите указатели, и ваш код будет работать нормально.В C # классы уже являются ссылками, такой вещи, как значение class, не существует, эта конструкция называется struct.

2 голосов
/ 27 апреля 2011

Вам не нужно объявлять их как указатели, так же как и тип:

class person{
   person mom;
   person dad;
   string Name;
   string Birthdate;     

   // Though I would probably use ICollection<Person> or IList<person>
   person[] children;

   //...constructors, destructors, methods etc...
}

Поскольку person является ссылочным типом , это все, что вам нужно.

Как правило, указатели не нужны в c # (хотя вы можете использовать их в коде, помеченном как unsafe).

0 голосов
/ 27 апреля 2011

Хм ... вам не нужны указатели на C # (чтобы сделать это).Если вы намереваетесь создать «дерево», просто удалите знак «*» перед именем типа.

надеюсь, это поможет.

0 голосов
/ 27 апреля 2011

C # код не использует указатели. Хотя можно написать C #, в котором используются указатели, этот код называется «небезопасным», и для использования этой функции в обычном коде очень мало причин, если таковые имеются.

Все классы на любом из языков .NET называются «ссылочными типами». Это означает, что везде, где вы видите этот тип, используемый в коде для переменной, члена или типа параметра, тогда значением этого объекта является ссылка , которая (из-за отсутствия лучшего термина) указывает на экземпляр типа. Другими словами, они функционируют очень похоже на указатели, но только в самом простом смысле (например, нет такой вещи, как «эталонная арифметика»).

Короче говоря, просто удалите звездочку из ваших объявлений, и ваш код будет работать так, как вы изначально предназначали для него. Хотя в вашем коде есть некоторые стилистические проблемы (код .NET условно PascalCased, а не camelCased, и лучше не выставлять переменные-члены напрямую, а использовать свойства), но это должно помочь вам.

0 голосов
/ 27 апреля 2011

Всякий раз, когда у вас есть переменная типа class, она автоматически становится ссылкой. Ссылка в C # ведет себя почти как указатель в C ++, за исключением того, что вы не можете делать арифметику с ней.

В отличие от C ++, вы не решаете использовать ссылки / значения при объявлении переменной, а при объявлении типа. Быть ссылкой или типом значения является неотъемлемым свойством типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...