* «Я лично полагаюсь на обнуление переменных в качестве заполнителя для последующего правильного удаления. Например, я трачу время, чтобы свернуть все элементы массива до фактического удаления (создания нулевого) самого массива.»
Это не нужно. Как работает Java GC, он находит объекты, которые не имеют к ним ссылок, поэтому, если у меня есть Object x с ссылкой (= variable) a, которая указывает на него, GC не удалит его, потому что есть ссылка к этому объекту:
a -> x
Если вы допустили null, это произойдет:
a -> null
x
Итак, теперь x не имеет ссылки, указывающей на него, и будет удален. То же самое происходит, когда вы устанавливаете ссылку на другой объект, кроме x.
Итак, если у вас есть массив arr, который ссылается на объекты x, y и z и переменную a, которая ссылается на массив, выглядит так:
a -> arr -> x
-> y
-> z
Если вы null, чем это происходит:
a -> null
arr -> x
-> y
-> z
Таким образом, GC обнаруживает, что arr не имеет ссылки на него и удаляет его, что дает вам эта структура:
a -> null
x
y
z
Теперь GC находит x, y и z и удаляет их также. Отброс каждой ссылки в массиве не будет делать ничего лучше, он просто будет использовать время и пространство процессора в коде (это говорит, что это не повредит дальше. GC все равно сможет выполнить так, как это должно быть ).
Я бы предложил создать дополнительный пользовательский объект и отобразить поля (либо вручную, либо с использованием инфраструктуры, такой как AutoMapper).
Применительно к вашему примеру это может выглядеть примерно так:
public class CustomObjectA
{
public int Id { get; set; }
public string stampleProperty { get; set; }
public string stampleProperty2 { get; set; }
public CusomObjectB[] B { get; set; }
}
public class CustomObjectB
{
public int BId { get; set; }
public string sampleProperty3{ get; set; }
public string sampleProperty4{ get; set; }
public int ComyId { get; set; }
}
И использование будет выглядеть так:
var a = db.A.FirstOrDefault(a => a.stampleProperty== stampleProperty);
var obj= new CustomObjectA
{
Id = a.AId,
sampleProperty= a.sampleProperty,
sampleProp= a.sampleProp,
B = a.B.Select(b => new CustomObjectB
{
BId = b.BId,
sampleProperty3 = b.sampleProperty3
//etc...
}).ToArray()
};
Не обязательно хорошая идея возвращать объекты базы данных напрямую по API по этим причинам (наряду с некоторыми другими, например, вы не хотите, чтобы третьи стороны, использующие ваш API, могли видеть каждое свойство в базе данных).
Общим термином для этого подхода является использование DTO (объектов передачи данных). Вот учебник от Microsoft, где они обсуждают его далее https://docs.microsoft.com/en-us/aspnet/web-api/overview/data/using-web-api-with-entity-framework/part -5 .