返回值,Ref,Out有什么区别吗?

时间:2015-07-24 07:19:40

标签: c#

我这样做,

context.startActivity(new Intent(context, Activity1.class));

如果我在这里使用Ref或Out,我会有什么好处吗?

进一步的实施需要我添加这个方法,

public Order Add(Order order)
{
    order.thisA = GetValue1();
    // update the state of object
    return order;
}

请根据最佳做法告诉我。

上下文

目前我只返回订单的INT ID,但将来可能我需要返回更多属性,但这里是完整的上下文,

https://codereview.stackexchange.com/questions/97778/crud-operation-class#

4 个答案:

答案 0 :(得分:5)

在这种情况下:

public MyObject Update(MyObject object)
{
    object.thisA = GetValue1();
    // update state of object
    return object;
}

更改MyObjects引用,因此:

  1. 需要退回该物品。
  2. 需要使用ref
  3. 需要使用out
  4. 使用out用于初始化对象(您必须在函数中指定值)。

    MyObject obj; // didn't assign anything
    Method(out obj);
    
    public void Method(out MyObject obj){
       obj = new MyObject(); // assigned
    }
    

    使用ref以防您可能更改方法内对象的引用:

    MyObject obj = new MyObject();
    Update(ref obj);
    
    public void Update(ref MyObject obj)
    {
        obj = new MyObject(); // changing the ref!!!
        obj.thisA = GetValue1();
    }
    
    顺便说一句,在你的情况下,你不需要做任何事情:

    public void UpdateCollection(Order[] orderCollection)
    {
        foreach(Order o in orderCollection)
              Update(o);
    }
    
    public void Update(MyObject object)
    {
        object.thisA = GetValue1();
    }
    

    您正在预告数组并更新对象而不是引用。

答案 1 :(得分:2)

如果您有可能想要更改引用而不是对象的数据,则使用( "<null>", ( 118, 111 ) )

示例:

ref

这将更改public void RetargetReference(ref List<string> originalList) { originalList = new List<string>(); originalList.Add("World"); } List<string> inList = new List<string>(); inList.Add("Hello"); RetargetReference(ref inList); 参考。它现在将指向列表,其中包含一个条目“World”。除非您有其他参考,否则将不再提供包含“Hello”的列表。

如果要更改在执行方法期间传入的参数,

inList参数可能很有用。

ref将用于让方法创建一个新的对象实例,而无需就可以传入值!

示例:

out

之后,public void CreateReference(out List<string> newList) { newList = new List<string>(); newList.Add("Hello World"); } List<string> list; CreateReference(out list); 将指向新的list实例。在方法内部,您无法访问List<string>实际上“指向”的任何内容。您将始终必须创建一个新实例。

如果您希望方法返回多个结果,则

newList参数非常有用。例如,以下方法将返回out表示成功,并返回两个包含数据的bool参数:

out

对象通常在C#中通过引用传递,因此以下方法实际上将数据更改为“方法外”:

public bool TrySplitString(string source, out string part1, out string part2)
{
    part1 = String.Empty;
    part2 = String.Empty;

    string[] parts = source.Split('=');
    if (parts.Length != 2)
        return false;

    part1 = parts[0];
    part2 = parts[1];
    return true;
}

之后,public void ChangeList(List<string> list) { list.Add("World"); } List<string> inList = new List<string>(); inList.Add("Hello"); ChangeList(inList); 包含两个条目:“Hello”和“World”。

有时你返回作为参数传入的对象的原因是这允许所谓的“方法链接”,你可以在其中“编写句子”而不是“命令”。你会在我的下一个例子中看到:

inList

您可以使用此代码并编写如下内容:

public static List<string> CreateList()
{
    return new List<string>();
}

public static List<string> AddItem(this List<string> list, string item)
{
    list.Add(item);
    return list;
}

public static List<string> DoSomethingWithList(this List<string> list)
{
    ...;

    return list;
}

答案 2 :(得分:0)

返回object可以用于创建“方法链”,如下所示:

someObject.Update(MyObject object).MyObjectMethod1().MyObjectMethod2();

答案 3 :(得分:0)

我无法真正锻炼你真正想要实现的目标。但是,我会给你一些基础知识。

在C#中,参数可以通过valuereference传递给参数。

如果您的MyObjectreference type(例如:class),则会将其作为reference传递给您,因此您最终会修改同一个对象。换句话说,您在此实例上(在函数内)所做的任何更改都将对该实例产生直接影响,并且在当前执行环境中将继续发生。

另一方面,如果MyObjectvalue type(例如:struct),那么它的副本将传递给方法。也就是说,即使修改方法中的成员,也不会更改值类型的原始实例。这是值类型的默认行为。

现在假设您要修改值类型的原始实例的场景。仅当您传递值类型的引用时,才能实现此目的。 refout来了。使用这些关键字,您可以通过引用传递参数。 refout之间存在差异,可以单独学习。但是,记住您的上下文,ref和out都允许被调用的方法修改参数。 ref表示参数在进入函数之前具有值。这样函数就可以读取和/或更改其中的值。另一方面,out表示参数在进入函数之前没有官方值。被调用的函数必须在参数从函数中退出之前对其进行初始化。