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

我知道如果参数的类型是class
Order
而不是interface
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
    };
}
通过引用传递参数,这意味着如果在函数中修改参数,则调用方的变量将被修改

基本上是一样的,只是调用方不必初始化变量,这始终是被调用方的责任

另一种方法是传递实例并填充其属性:

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,我明白了: