Сколько экземпляров типа будет создано - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть два проекта: BusinessLogic (BL) и DataAccess (DL).Теперь я передаю тип в качестве параметра от controller до BL и до DL в конце.Ниже приведен код.

Контроллер

public ActionResult SomeAction (SomeClassForTable table)
{
    bool result = new ServiceInBL.DoSomeStuffWithParameter(table);
}

BL

public class ServiceInBL
{
    bool DoSomeStuffWithParameter (SomeClassForTable classForTable)
    {
        MethodForCrudInDL dl = new MethodForCrudInDL();
        return dl.DoSomeStuffWithParameter(classForTable);
    }
}

DL

public class MethodForCrudInDL
{
    public bool DoSomeStuffWithParameter (SomeClassForTable classForTable)
    {
        return true;
    }
}

SomeClass

public class SomeClassForTable
{
    // type members
}

Из моего контроллера я вызываю метод в BL и из BL, вызывая метод в DL.Теперь я хочу знать, сколько экземпляров SomeClassForTable будет создано в памяти в ходе всего процесса?Будет ли три экземпляра (BL, DL и один в контроллере)?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Один экземпляр SomeClassForTable создается при вызове действия контроллера. Затем создается ссылка на этот класс (переменная table). Ссылки указывают на объект , они не содержат никаких данных непосредственно . Обновления ссылки перенаправляются на базовое значение.

Затем, когда вы звоните ServiceInBL.DoSomeStuffWithParameter(table);, вы передаете ссылку, а не фактическое значение. Любые изменения, сделанные в DoSomeStuffWithParameter, обновят исходный объект.

То же самое происходит для MethodForCrudInDL. так что во всем вашем коде есть только один экземпляр SomeClassForTable.

Обратите внимание, если вы передали тип значения (то есть int или struct). Тогда все вызовы методов будут каждый раз создавать новый объект. Эти объекты не будут обновляться и будут действовать независимо. См. В чем разница между передачей по ссылке и передачей по значению?

См. Блог Джона Скитса по Ссылки и значения для получения дополнительной информации

0 голосов
/ 24 апреля 2018

Логически существует только 1 экземпляр, и он пропускается через стек, потому что это параметр ByRef.

В действительности эти слои, вероятно, работают на разных машинах, и MarshalByRef может использоваться для создания «всех 3».притвориться тем же объектом ... но это медь и кремний, в коде у вас есть только 1 экземпляр.

0 голосов
/ 24 апреля 2018

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

Объекты могут быть созданы неявно в такой ситуации, если в них входит неявное преобразование, определенное пользователем. Например:

public void Method1(string x)
{
    Method2(x);
}

public void Method2(XNamespace ns)
{
}

Здесь вызов Method2 использует пользовательское неявное преобразование из string в XNamespace, которое может создать новый объект. Но если между типом параметра и типом аргумента есть преобразование ссылки (например, если они одного типа или тип параметра метода является базовым классом типа аргумента), то ссылка будет просто копируется как начальное значение параметра.

Все усложняется, если задействованы разные AppDomain, но я подозреваю, что вы не в этой ситуации (к счастью).

...