将创建多少个类型的实例

How many instances of type will be created

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

一些类

public class SomeClassForTable
{
    // type members
}

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

您没有显示正在创建的任何 个实例——但是从一个方法传递一个引用到不会隐式地创建一个新实例,不。它复制 reference,而不是 object。这些方法是否在同一个程序集中并不重要。

对象可以在这种情况下隐式创建,如果涉及用户定义的隐式转换。例如:

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

public void Method2(XNamespace ns)
{
}

这里对Method2的调用使用了用户定义的从stringXNamespace的隐式转换,这可以创建一个新对象。但是如果参数类型和实参类型之间存在 引用转换(例如,如果它们是同一类型,或者方法参数类型是实参的基础 class type) 那么引用将被简单地复制为参数的初始值。

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

调用控制器操作时会创建 SomeClassForTable 的一个实例。然后创建对该 class(变量 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 博客

逻辑上只存在 1 个实例,它通过堆栈传递,因为它是一个 ByRef 参数。

实际上,这些层可能 运行 在不同的机器上并且 MarshalByRef 可能被用来使 'all 3' 假装是同一个对象......但那是铜和硅,回到代码,您只有 1 个实例。