C# 将创建多少个类型的实例
我有两个项目,分别是C# 将创建多少个类型的实例,c#,.net,class,instances,C#,.net,Class,Instances,我有两个项目,分别是BusinessLogic(BL)和DataAccess(DL)。现在我将type作为参数从controller传递到BL并最终传递到DL。下面是代码 控制器 基本法 DL 某类 从我的控制器,我正在调用BL中的方法,从BL调用DL中的方法。现在我想知道在整个过程中,会在内存中创建多少个SomeClassForTable实例?是否会有三个实例(BL,DL,以及controller中的一个)?您尚未显示正在创建的任何实例-但是将引用从一个方法传递到不会隐式创建新实例,否。它复制
BusinessLogic(BL)
和DataAccess(DL)
。现在我将type作为参数从controller
传递到BL
并最终传递到DL
。下面是代码
控制器
基本法
DL
某类
从我的控制器,我正在调用BL
中的方法,从BL
调用DL
中的方法。现在我想知道在整个过程中,会在内存中创建多少个SomeClassForTable
实例?是否会有三个实例(BL
,DL
,以及controller中的一个)?您尚未显示正在创建的任何实例-但是将引用从一个方法传递到不会隐式创建新实例,否。它复制引用,而不是对象。方法是否在同一程序集中并不重要
在这种情况下,如果涉及用户定义的隐式转换,可以隐式创建对象。例如:
public void Method1(string x)
{
Method2(x);
}
public void Method2(XNamespace ns)
{
}
这里对Method2
的调用使用用户定义的从string
到XNamespace
的隐式转换,这可以创建一个新对象。但是,如果参数类型和参数类型之间存在引用转换(例如,如果它们是相同的类型,或者方法参数类型是参数类型的基类),那么引用将被简单地复制为参数的初始值
如果涉及到不同的
AppDomain
s,事情会变得更加复杂,但我怀疑您没有遇到这种情况(幸运的是)。调用控制器操作时,会创建一个SomeClassForTable
实例。然后创建对该类的引用(变量表
)。引用指向对象它们不直接包含任何数据。对引用的更新将重新定向到基础值
然后调用ServiceInBL.DoSomeStuffWithParameter(表)时代码>传递的是引用,而不是实际值。DoSomeStuffWithParameter
中所做的任何更改都将更新原始对象
同样的情况也发生在MethodForCrudInDL
中。因此,在所有代码中,只有一个SomeClassForTable
的实例
注意如果您传递了值类型(即int
或struct
)。然后,每次对方法的所有调用都将创建一个新对象。这些对象不会更新,将独立运行。看
有关更多信息,请参见Jon Skeets的博客逻辑上只存在一个实例,它通过堆栈传递,因为它是ByRef参数
实际上,这些层可能运行在不同的机器上,MarshallByRef可能用于使“所有3”假装为同一个对象。。。但这是铜和硅,回到代码中,您只有一个实例。我已经提到了控制器。只是没有在代码中显示。如果你不显示代码,我们怎么知道?@DhavalR:问题是你的问题不清楚。如果您想知道将参数传递给方法是否会创建该方法的新副本,请询问它。如果您想知道将创建多少个实例,请向我们展示您的所有代码。据我们所知,您正在控制器中创建十七个对象实例,因此我们实际上不能说“只有一个”。我们可以说“在代码中,您没有显示任何内容”。Jon Skeet的示例介绍了默认情况下按值传递对象引用。我相信这适用于本案@MuKa:恐怕我不理解你的评论。你是说这有点不准确吗?对象永远不会被传递。引用可以通过值传递,或者值类型值可以通过值传递,或者变量可以通过引用传递…我正在编辑注释并按[Enter]转到下一行,但它提交了注释!很抱歉我认为转换位不相关。不知道你为什么加上它TBH@Liam:显示对象可以作为向方法传递值的一部分来创建是相关的,即使OP的代码不是这样。
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
}
public void Method1(string x)
{
Method2(x);
}
public void Method2(XNamespace ns)
{
}