2013-06-17 2 views
0

Быстрый вопрос.Может ли объект выпадать из сферы действия?

Рассмотрим этот код

public class Tile 
{ 
    public Collision Collision; 
    public Tile() 
    { 
     Collision = new Collision(this); 
    } 
    public ~Tile() 
    { 
     CollisionHandler.Remove(Collision); 
    } 
} 

public class Collision 
{ 
    public Collision() 
    { 
     CollisionHandler.Add(this); 
    } 
} 

public class Main 
{ 
    public Main() 
    { 
     Test1(); 
     Test2(); 
    } 

    public void Test1() 
    { 
     Tile[,] tiles = new Tile[20,20]; 
     tiles[0,0] = new Tile(); 

     tiles[0,0] = new Tile(); 
     //Would calling the above call the old Tile's destructor? 
    } 

    public void Test2() 
    { 
     Tile[,] tiles = new Tile[20,20]; 
     tiles[0,0] = new Tile(); 

     Tile t = new Tile(); 
     tiles[0,0] = t 
     //Would calling the above call the old Tile's destructor? 
    } 
} 

Теперь, когда я бегу Test1 бы старый Tile «s финализации назвать? Как насчет Test2?

+0

FIrstly: они называются «финализаторы» на C#. Они не то же самое. Во-вторых, что мешает вам проверить это самостоятельно? –

+0

Я нахожусь на своем телефоне на самолете, хотел знать, потому что я грубо чернил некоторые функции. – redcodefinal

ответ

1

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

Поэтому не используйте деструкторы для вашей логики системы. Существует не так много ситуаций, когда вы должны использовать деструкторы вообще.

+0

Хорошо, но было бы неплохо, если бы второе оно выпало из объема, которое он собирает. Я должен буду что-то сделать, если я подниму Плитку под Столкновением. – redcodefinal

+0

Внедрить IDisposable и обернуть класс Tile в 'using' statement – Fendy

3

Ответ отрицательный.

Объекты не доработаны до тех пор, пока сборщик мусора не решит, что хочет. Ни в коем случае в этом вы ничего не делаете, как C++ delete. Вы просто выделяете новую часть памяти и меняете указатель (грубо).

Как указано в комментариях: Finalizers (C#) и Destructors (C++) не совпадают.

+0

Спасибо за ответ. Наверное, мне придется искать в другом месте – redcodefinal

0

Ваш код не заполнен. Если бы это было завершено, эталонные объекты были бы скованы как CollisionHandler->Collision->Tile, поэтому ваш пренебрегаемый Tile никогда не будет собран сборщиком мусора.

.NET GC не является детерминированным, поэтому, если вы ищете что-то вроде автоматически управляемого детерминированного деструктора, так что вам не повезло. .NET framework обеспечивает интерфейс IDispose для ситуации, когда детерминированная очистка является предпочтительной, например. File I/O, но потребители должны знать об этом и вызывать Dispose явно или с помощью функции языка, например, ключевого слова using в C#.

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