2015-11-09 2 views
1

Я использую C# для записи списка, который будет содержать уникальные экземпляры класса. Я хочу написать функцию, которая добавляет один экземпляр этого класса и возвращает указатель на него.C# List Добавить и получить ссылку

public class Marble 
{ 
    public Marble(int ID) 
    { 
    // Initialize based on unique ID 
    } 
} 

public class Bag 
{ 
    private List<Marble> marbles = new List<Marble>(); 
    public Marble Add(int ID) 
    { 
     Marble m = new Marble(ID); 
     marbles.Add(m); 
     return m; 
    } 
} 

Кажется, это было бы более оптимизировано, чем добавление нового мрамора и поиск подходящего идентификатора. Однако будет ли Marble m выходить из сферы действия при возвращении? Насколько я понимаю Списки, это просто динамический массив указателей. Если Marble m перестанет существовать, будет ли указатель списка более недействительным?

+1

До тех пор, пока есть экземпляр «Сумки», где-то упоминается, этот экземпляр должен иметь список мраморов. –

+1

«Мраморный м» будет ссылочным типом - он не выйдет за рамки, когда он будет возвращен из метод. См. Эту статью Джона Скита для получения дополнительной информации - http://jonskeet.uk/csharp/references.html – Tim

+0

В C# ссылочные типы (которые в этом случае есть) всегда будут храниться указателем. Не беспокойтесь о разрушаемых вещах, у вас есть сборщик мусора, чтобы сделать это. 'return m' вернет указатель, и m не будет уничтожен, пока вы не закончите с ним. – thijmen321

ответ

2

Нет, указатель списка будет в порядке. В списке содержится ссылка на объект Marble, который вы создали, и пока список содержит эту ссылку, без какого-либо вмешательства со стороны, ссылка всегда будет действительной.

Кроме того, если вы по какой-то причине решили удалить ссылку из списка, и ничто другое не ссылается на нее, то ссылка станет чем-то вроде обвисшего указателя и будет автоматически собрана сборщиком мусора, В вашем случае тоже нужно очистить.

Помните, что ваш экземпляр Marble - это reference type, и это как он должен работать.

Это может звучать как волшебство для кого-то, что используется на языке C, где то, что вы сделали, было бы проблемой, если бы мрамор не был помещен в кучу (через новый, malloc и их вид).

0

будет Marble m выходит из сферы действия при возвращении?

Да, это абсолютно так. Это локальная переменная этого метода; это область для этого вызова метода, поэтому, когда метод возвращает эту переменную, выходит за рамки. Так получилось, что в этом конкретном случае время жизни этой переменной также заканчивается, когда эта переменная возвращается, так что переменная сможет быть очищена в этот момент времени. Теоретически возможно, что время жизни переменной отличается от ее объема, но в данном случае это не так. См. this article для детального анализа разницы.

Как я понимаю Списки, это просто динамический массив указателей. Если Marble m перестанет существовать, будет ли указатель списка более недействительным?

Это абсолютно справедливо. Потеря переменной m означает, что эта ссылка больше не существует; это не означает, что объект, на который ссылается ссылка переменной, больше не существует.

Чтобы использовать аналогию, вспомните переменную как лист бумаги. Вы пишете адрес на этом листе бумаги. Затем вы сжигаете эти кусочки бумаги в пепел. Что происходит с вашим домом? Ничего не происходит с вашим домом; что одна ссылка на него никоим образом не влияет на дом; если у вас есть адрес дома по какой-то другой причине (скажем, вы скопировали адрес на другой лист бумаги перед его сжиганием), вы все равно можете найти дом, и уничтожение бумаги никоим образом не повредит дом.

Смежные вопросы