我这样做,
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#
答案 0 :(得分:5)
在这种情况下:
public MyObject Update(MyObject object)
{
object.thisA = GetValue1();
// update state of object
return object;
}
您不更改MyObjects引用,因此:
ref
。out
。使用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#中,参数可以通过value
或reference
传递给参数。
如果您的MyObject
是reference type
(例如:class
),则会将其作为reference
传递给您,因此您最终会修改同一个对象。换句话说,您在此实例上(在函数内)所做的任何更改都将对该实例产生直接影响,并且在当前执行环境中将继续发生。
另一方面,如果MyObject
是value type
(例如:struct
),那么它的副本将传递给方法。也就是说,即使修改方法中的成员,也不会更改值类型的原始实例。这是值类型的默认行为。
现在假设您要修改值类型的原始实例的场景。仅当您传递值类型的引用时,才能实现此目的。 ref和out来了。使用这些关键字,您可以通过引用传递参数。 ref和out之间存在差异,可以单独学习。但是,记住您的上下文,ref和out都允许被调用的方法修改参数。
ref
表示参数在进入函数之前具有值。这样函数就可以读取和/或更改其中的值。另一方面,out
表示参数在进入函数之前没有官方值。被调用的函数必须在参数从函数中退出之前对其进行初始化。