如何在执行方法后将填充的接口实例作为方法的参数?

时间:2015-06-07 10:31:14

标签: 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,
        Quantity = mciOrderInfo.Quantity,
        ShoppingItemId = shoppingItem
    };
}

执行此方法MakeOrder后,Caller将获得order = null,但此方法会填充order,如上所述。

我知道如果参数的类型是类Order而不是接口IOrder,它将在Caller方法中填充和访问。

有什么问题?

2 个答案:

答案 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>