|
|
|
новичок
      
участник
Last Login: 25.04.2006 16:37
Сообщ.: 6,
Visits: 67
|
|
Всем добрый день.
У меня появился такой вопрос:
Предположим, есть такой код:
AnotherObj GetAO()
{
SomethingObj A = new Something("wow");
AnotherObj B = A.SomePropery;
return B;
}
Т.е. объект B - это фактически ссылка на какое-то поле объекта A. При выходе, функция возвращает объект B. Но фактически возвращает ссылку на некоторое поле объекта A. Получается, что после выхода за область видимости функции, объект A не может быть уничтожен, т.к. на него есть ссылка. Таким образом, если объект A занимает много памяти, мы просто теряем эту память, так как нам не нужен весь объект, а нужно лишь одно его поле.
Это дейчтвительно так, или в строке
AnotherObj B = A.SomePropery;
будет создана копия объекта A.SomePropery и объекту B уже будет присвоена ссылка на этот созданный объект???
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
[quote="GOster"]Т.е. объект B - это фактически ссылка на какое-то поле объекта A.[/quote]
Нет! Переменная B хранит адрес объекта класса AnotherObj в управляемой куче.
[quote="GOster"]Но фактически возвращает ссылку на некоторое поле объекта A.[/quote]
Опять же - нет. Возвращается указатель. Таким образом объект A и переменная B хранят указатель на один и тот же участок в куче.
[quote="GOster"]Получается, что после выхода за область видимости функции, объект A не может быть уничтожен, т.к. на него есть ссылка. Таким образом, если объект A занимает много памяти, мы просто теряем эту память, так как нам не нужен весь объект, а нужно лишь одно его поле.[/quote]
Яркий пример неправильного вывода при исхождении из неправильной посылки. Объекты A и B в общем случае никак не связаны. То есть если объект B не удерживает ссылку на родительский объект А, то A может быть спокойно уничтожен, а B будет продолжать жить. Вот пример такой ситуации (в присоединенном файле можно посмотреть результат выполнения этой консольной программы):
using System;
public class AnotherObj
{
public AnotherObj()
{
}
~AnotherObj()
{
Console.WriteLine("CLR is executing AnotherObj finalizer.");
}
}
public class SomethingObj
{
private string _s;
private AnotherObj _somePropery;
public AnotherObj SomePropery
{
get { return _somePropery; }
}
public SomethingObj(string s)
{
_s = s;
_somePropery = new AnotherObj();
}
~SomethingObj()
{
Console.WriteLine("CLR is executing SomethingObj finalizer.");
}
}
public class ConsoleApp
{
private static AnotherObj GetAO()
{
Console.WriteLine("GetAO() begin");
SomethingObj A = new SomethingObj("wow");
AnotherObj B = A.SomePropery;
Console.WriteLine("GetAO() end");
return B;
}
public static void Main()
{
AnotherObj b = GetAO();
Console.WriteLine("Press to start GC");
Console.ReadLine();
GC.Collect();
Console.WriteLine("Press to start GC #2");
Console.ReadLine();
Console.WriteLine(b.ToString());
GC.Collect();
Console.WriteLine("Press to quit");
Console.ReadLine();
}
}
По результатам выполнения ясно видно что завершитель (finalizer) для класса SomethingObj выполняется раньше завершителя класса AnotherObj, что говорит само за себя.
[quote="GOster"]Это дейчтвительно так, или в строке
AnotherObj B = A.SomePropery;
будет создана копия объекта A.SomePropery и объекту B уже будет присвоена ссылка на этот созданный объект???[/quote]
Ни то, ни другое, если только свойство SomePropery не написано таким образом чтобы всегда возвращать копию объекта AnotherObj.
|
|
|
|
|
Forum Member
      
участник
Last Login: 19.08.2008 17:28
Сообщ.: 49,
Visits: 512
|
|
Молодец bazile хорошо изложил!!!
З.Ы. Все бы так отвечали
|
|
|
|