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

本文关键字:方法 接口 实例 参数 执行 填充 | 更新日期: 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
    };
}

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文章:传递引用类型参数

问题是你在这里处理多个变量。

这条线

:

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类型的参数(类),您仍然会遇到相同的问题。

相关文章: