我有一个方法可以填充接口的实例,如下所示:
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
方法中填充和访问。
有什么问题?
答案 0 :(得分:1)
最简单的方法是使用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
};
}
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;
}
这是有效的,因为类(和接口)是引用类型。
您应该阅读此MSDN文章:Passing Reference-Type Parameters。
答案 1 :(得分:1)
问题是你在这里处理多个变量。
这一行:
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
(类)的参数,您仍然会遇到同样的问题。 / p>