C# 执行方法后,如何将填充的接口实例作为方法的参数获取?
我有一个方法填充接口实例,如下所示:C# 执行方法后,如何将填充的接口实例作为方法的参数获取?,c#,C#,我有一个方法填充接口实例,如下所示: private static void Caller() { IOrder order = null; MakeOrder(order); //order is empty } private static void MakeOrder(IOrder order) { order = new Order { PeriodCount = mciOrderInfo.PeriodCount,
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
调用方将获得order=null
,但此方法如上所述填充order
我知道如果参数的类型是classOrder
而不是interfaceIOrder
,它将在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
};
}
通过引用传递参数,这意味着如果在函数中修改参数,则调用方的变量将被修改
基本上是一样的,只是调用方不必初始化变量,这始终是被调用方的责任
另一种方法是传递实例并填充其属性:
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文章:。问题是您在这里处理的是多个变量 这一行:
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
类型的参数(a类),您仍然会遇到相同的问题。啊,我明白了。我在智能手机上打字,速度很慢…;-)@Lucas为什么接口参数需要out或ref,而类参数不需要?@Ali我想你把引用类型和引用参数搞混了。我已经编辑了我的答案,添加了第三个没有ref
的示例。你应该考虑阅读一些关于这件事的教程,因为理解它是非常重要的。“LucasTrzesniewski,我明白了: