我有两个项目BusinessLogic (BL)
和DataAccess (DL)
。现在我将类型作为参数从controller
传递到BL
,最后传递到DL
。以下是代码。
public ActionResult SomeAction (SomeClassForTable table)
{
bool result = new ServiceInBL.DoSomeStuffWithParameter(table);
}
public class ServiceInBL
{
bool DoSomeStuffWithParameter (SomeClassForTable classForTable)
{
MethodForCrudInDL dl = new MethodForCrudInDL();
return dl.DoSomeStuffWithParameter(classForTable);
}
}
public class MethodForCrudInDL
{
public bool DoSomeStuffWithParameter (SomeClassForTable classForTable)
{
return true;
}
}
public class SomeClassForTable
{
// type members
}
在我的控制器中,我在BL
和BL
调用方法,在DL
中调用方法。现在我想知道在整个过程中将在内存中创建多少SomeClassForTable
个实例?是否会有三个实例(BL
,DL
和控制器中的一个实例?
答案 0 :(得分:4)
您尚未显示正在创建的任何实例 - 但是将引用从一个方法传递到不会隐式创建新实例,不是。它复制引用,而不是对象。方法是否在同一个组件中无关紧要。
如果涉及用户定义的隐式转换,可以在这种情况下隐式创建对象 。例如:
public void Method1(string x)
{
Method2(x);
}
public void Method2(XNamespace ns)
{
}
此处对Method2
的调用使用用户定义的从string
到XNamespace
的隐式转换,可以创建新对象。但是如果参数类型和参数类型之间存在引用转换(例如,如果它们是相同的类型,或者方法参数类型是参数类型的基类)那么引用将只是被复制为参数的初始值。
如果涉及不同的AppDomain
,情况会变得更复杂,但我怀疑你不是那种情况(幸运的是)。
答案 1 :(得分:1)
调用控制器操作时会创建一个SomeClassForTable
实例。然后创建对该类的引用(变量table
)。引用指向对象它们不直接包含任何数据。对引用的更新将重定向到基础值。
然后,当您致电ServiceInBL.DoSomeStuffWithParameter(table);
时,您传递的参考不是实际值。在DoSomeStuffWithParameter
中所做的任何更改都将更新原始对象。
MethodForCrudInDL
也是如此。所以在你的所有代码中只有SomeClassForTable
的一个实例。
请注意,如果您传递了值类型(即int
或struct
)。然后,所有对方法的调用都会每次都创建一个新对象。这些对象不会更新并且会独立行动。见What's the difference between passing by reference vs. passing by value?
有关详细信息,请参阅References and Values上的Jon Skeets博客
答案 2 :(得分:0)
逻辑上只存在一个实例,并且它已经通过堆栈,因为它是一个ByRef参数。
实际上,这些图层可能在不同的机器上运行,并且可能正在使用MarshalByRef来制作所有3'假装是同一个对象......但是那个铜和硅,在代码中,你只有一个实例。