将创建多少个类型的实例
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
}
从我的控制器,我在 BL
和 BL
中调用方法,在 DL
中调用方法。现在我想知道在整个过程中将在内存中创建多少个 SomeClassForTable
实例?是否会有三个实例(BL
、DL
和控制器中的一个)?
您没有显示正在创建的任何 个实例——但是从一个方法传递一个引用到不会隐式地创建一个新实例,不。它复制 reference,而不是 object。这些方法是否在同一个程序集中并不重要。
对象可以在这种情况下隐式创建,如果涉及用户定义的隐式转换。例如:
public void Method1(string x)
{
Method2(x);
}
public void Method2(XNamespace ns)
{
}
这里对Method2
的调用使用了用户定义的从string
到XNamespace
的隐式转换,这可以创建一个新对象。但是如果参数类型和实参类型之间存在 引用转换(例如,如果它们是同一类型,或者方法参数类型是实参的基础 class type) 那么引用将被简单地复制为参数的初始值。
如果涉及不同的 AppDomain
,事情会变得更加复杂,但我怀疑你不是那种情况(幸运的是)。
调用控制器操作时会创建 SomeClassForTable
的一个实例。然后创建对该 class(变量 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 博客
逻辑上只存在 1 个实例,它通过堆栈传递,因为它是一个 ByRef 参数。
实际上,这些层可能 运行 在不同的机器上并且 MarshalByRef 可能被用来使 'all 3' 假装是同一个对象......但那是铜和硅,回到代码,您只有 1 个实例。
我有两个项目 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
}
从我的控制器,我在 BL
和 BL
中调用方法,在 DL
中调用方法。现在我想知道在整个过程中将在内存中创建多少个 SomeClassForTable
实例?是否会有三个实例(BL
、DL
和控制器中的一个)?
您没有显示正在创建的任何 个实例——但是从一个方法传递一个引用到不会隐式地创建一个新实例,不。它复制 reference,而不是 object。这些方法是否在同一个程序集中并不重要。
对象可以在这种情况下隐式创建,如果涉及用户定义的隐式转换。例如:
public void Method1(string x)
{
Method2(x);
}
public void Method2(XNamespace ns)
{
}
这里对Method2
的调用使用了用户定义的从string
到XNamespace
的隐式转换,这可以创建一个新对象。但是如果参数类型和实参类型之间存在 引用转换(例如,如果它们是同一类型,或者方法参数类型是实参的基础 class type) 那么引用将被简单地复制为参数的初始值。
如果涉及不同的 AppDomain
,事情会变得更加复杂,但我怀疑你不是那种情况(幸运的是)。
调用控制器操作时会创建 SomeClassForTable
的一个实例。然后创建对该 class(变量 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 博客
逻辑上只存在 1 个实例,它通过堆栈传递,因为它是一个 ByRef 参数。
实际上,这些层可能 运行 在不同的机器上并且 MarshalByRef 可能被用来使 'all 3' 假装是同一个对象......但那是铜和硅,回到代码,您只有 1 个实例。