2010-02-18 4 views
3

Просто есть несколько вопросов, на мой взгляд ...создания объекта без ссылки

  1. Это хорошая практика, чтобы создать объект без ссылки, как показано ниже. Если да, то почему?

    LoadIt(new myClass()); где LoadIt является некоторый метод

  2. Что происходит с объектом, созданным выше. Будет ли это сбор мусора. Если да, то когда? т.е. его область действия та же, что и другие объекты.

  3. Есть ли шанс снова обратиться к одному и тому же объекту?

ответ

3

Область решается методом (здесь LoadIt) ...

Если методы нагрузки он хранит параметр MyClass в глобальной переменной, не затем, пока глобальная переменная выходит из области видимости, то Объект останется в памяти ... т.е. Это не будет сбор мусора, поскольку глобальная переменная все еще ссылается на него ...

Объекты, как правило, хранятся в куче и могут быть указаны многими переменными, находящимися в стеке ... Здесь вы не хотите хранить ссылку в стек вашего метода ... Но он ссылается в стек метода LoadIt по его параметру ... Следовательно, объект не будет собирать мусор до тех пор, пока параметр Load the method не выходит за пределы области ... В то же время метод LoadIt может попытаться ссылаться на него снова в глобальной переменной или передать его как параметр другому методу ... В целом, только когда все ссылки для объекта в стеке (или в других объектах) выходят за пределы области видимости, объект - сбор мусора ...

Возвращение ссылки на этот объект, чисто де- в зависимости от того, что делает метод «Загрузить» с этим объектом ... Если метод ничего не делает, кроме ссылки на него с переменной параметра, то вы не можете его вернуть ... Но если метод копирует ссылку на другую переменную, доступную общедоступную , то вы можете использовать эту переменную и вернуть ссылку.

+0

Это не анонимный объект! 'new {propOne =" hello "};' is. –

+0

Да, слово анонимное неправильно ... Я просто использовал его, потому что я не знаю лучшего слова ... –

+1

Нет ни слова, потому что концепция на самом деле не существует, так как вы описываете ее в CLR. Либо объекты достижимы, то есть ссылка укоренена - или это не так. Если у объекта нет доступных ссылок, он называется «недоступным» и, следовательно, является кандидатом на сбор. – codekaizen

2

2) По умолчанию не существует способа узнать, когда этот (или любой) объект будет собираться мусором, поскольку это недетерминированный процесс.

3) Абсолютно. Все зависит от того, что происходит в методе LoadIt.

+0

# 2 немного вводит в заблуждение - есть способы узнать, и это может быть детерминированным, но эти вещи должны быть сконфигурирован специально. Поведение по умолчанию состоит в том, что GC не является детерминированным. – codekaizen

+0

Спасибо за редактирование этого ... – codekaizen

+0

@codekaizen: Word. –

2

Если LoadIt был определен как

public MyClass LoadIt(MyClass myClass) 
{ 
    ... do somthing 
    return myClass; 
} 

Вы можете ссылаться на него снова.

+0

Эта иллюстрация была хорошей – Amsakanna

1
  1. Не имеет значения, если (и вы в этом не сомневались в # 3), вам нужно обратиться к тому же экземпляру MyClass позже.

  2. Он имеет такой же объем, как если бы вы сделали var a = new MyClass(). Он будет GCed точно так же, как и любой другой объект; то есть, когда больше нет ссылок на него, и GC работает.

  3. № Если, конечно, LoadIt не должен был возвращать объект.

1

Чтобы убедиться, что вы получите полный ответ на # 2, понимаю, что вы сделать есть ссылка на этот объект.Вы создали его и передали ссылку на метод, который в методе называется параметром. Это действительная ссылка на объект, и она не будет собрана до тех пор, пока метод имеет выдающийся код-путь к этому параметру, поскольку ссылка считается доступной (ее можно проследить через некоторый график объектов, начиная с один из 5 корней GC, в этом случае, вероятно, стек или регистр CPU).

0

1) это зависит от того, что вы пытаетесь сделать, хотя, когда вы проходите новый экземпляр объекта, всегда лучше создавать новый экземпляр в нужном месте. но я уверен, что вы об этом знаете.

2) Любой управляемый код - это сбор мусора, поэтому да, это будет сбор мусора, и когда будет определено CLR.

3) да, вы можете ссылаться на него в методе LoadIt, но не снаружи LoadIt.

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