Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将创建多少个类型的实例_C#_.net_Class_Instances - Fatal编程技术网

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)
{
}