如何在执行方法后将填充的接口实例作为方法的参数
本文关键字:方法 接口 实例 参数 执行 填充 | 更新日期: 2023-09-27 17:54:06
我有一个方法填充一个接口的实例如下:
private static void Caller() {
IOrder order = null;
MakeOrder(order);
//order is empty
}
private static void MakeOrder(IOrder order) {
order = new Order
{
PeriodCount = mciOrderInfo.PeriodCount,
Quantity = mciOrderInfo.Quantity,
ShoppingItemId = shoppingItem
};
}
执行此方法MakeOrder
后,Caller
将得到order = null
,但此方法将像上面一样填充order
。
我知道如果参数类型是一个类Order
而不是接口IOrder
,它将在Caller
方法中被填充和访问。
有什么问题吗?
最简单的方法是使用return
:
private static void Caller()
{
IOrder order = MakeOrder();
}
private static IOrder MakeOrder()
{
return new Order
{
PeriodCount = mciOrderInfo.PeriodCount,
Quantity = mciOrderInfo.Quantity,
ShoppingItemId = shoppingItem
};
}
或者,如果出于某种原因你不想这样做,你可以使用ref
/out
:
private static void Caller()
{
IOrder order;
MakeOrder(out order);
}
private static void MakeOrder(out IOrder order)
{
order = new Order
{
PeriodCount = mciOrderInfo.PeriodCount,
Quantity = mciOrderInfo.Quantity,
ShoppingItemId = shoppingItem
};
}
另一种方法是传递一个实例并填充它的属性: 这样做是因为类(以及接口)是引用类型。 你应该阅读这篇MSDN文章:传递引用类型参数ref
通过引用传递参数,这意味着如果你在函数中修改它,调用者的变量将被修改。out
基本上是相同的,除了调用者不需要初始化变量,它总是由被调用者负责。private static void Caller()
{
IOrder order = new Order();
MakeOrder(order);
}
private static void MakeOrder(IOrder order)
{
order.PeriodCount = mciOrderInfo.PeriodCount;
order.Quantity = mciOrderInfo.Quantity;
order.ShoppingItemId = shoppingItem;
}
问题是你在这里处理多个变量。
这条线:
MakeOrder(order);
使用该变量值的副本调用MakeOrder
,该变量当前为null
。在MakeOrder
内部,您将局部参数变量更改为新值,但外部的原始order
变量仍然是null
。
也许你想用返回类型来代替:
private static void Caller()
{
IOrder order = MakeOrder(order);
}
private static IOrder MakeOrder()
{
return new Order
{
PeriodCount = mciOrderInfo.PeriodCount,
Quantity = mciOrderInfo.Quantity,
ShoppingItemId = shoppingItem
};
}
还要注意,参数的类型与此无关,即使您将MakeOrder
更改为接受Order
类型的参数(类),您仍然会遇到相同的问题。