将创建多少个类型实例

时间:2018-04-24 12:34:02

标签: c# .net class instances

我有两个项目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
}

在我的控制器中,我在BLBL调用方法,在DL中调用方法。现在我想知道在整个过程中将在内存中创建多少SomeClassForTable个实例?是否会有三个实例(BLDL和控制器中的一个实例?

3 个答案:

答案 0 :(得分:4)

您尚未显示正在创建的任何实例 - 但是将引用从一个方法传递到不会隐式创建新实例,不是。它复制引用,而不是对象。方法是否在同一个组件中无关紧要。

如果涉及用户定义的隐式转换,

可以在这种情况下隐式创建对象 。例如:

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

public void Method2(XNamespace ns)
{
}

此处对Method2的调用使用用户定义的从stringXNamespace的隐式转换,可以创建新对象。但是如果参数类型和参数类型之间存在引用转换(例如,如果它们是相同的类型,或者方法参数类型是参数类型的基类)那么引用将只是被复制为参数的初始值。

如果涉及不同的AppDomain,情况会变得更复杂,但我怀疑你不是那种情况(幸运的是)。

答案 1 :(得分:1)

调用控制器操作时会创建一个SomeClassForTable实例。然后创建对该类的引用(变量table)。引用指向对象它们不直接包含任何数据。对引用的更新将重定向到基础值。

然后,当您致电ServiceInBL.DoSomeStuffWithParameter(table);时,您传递的参考不是实际值。在DoSomeStuffWithParameter中所做的任何更改都将更新原始对象。

MethodForCrudInDL也是如此。所以在你的所有代码中只有SomeClassForTable的一个实例。

请注意,如果您传递了值类型(即intstruct)。然后,所有对方法的调用都会每次都创建一个新对象。这些对象不会更新并且会独立行动。见What's the difference between passing by reference vs. passing by value?

有关详细信息,请参阅References and Values上的Jon Skeets博客

答案 2 :(得分:0)

逻辑上只存在一个实例,并且它已经通过堆栈,因为它是一个ByRef参数。

实际上,这些图层可能在不同的机器上运行,并且可能正在使用MarshalByRef来制作所有3'假装是同一个对象......但是那个铜和硅,在代码中,你只有一个实例。