0
因为在C#中值类型是transportet ByValue用作函数的参数,而对象被传输ByRef。所以我的问题是:什么更好(更快/更高性能/更少内存)?最有效的方式来主要对象 - byref或返回值
为了给你一个例子:
public void ChangeObjectByRef(MyObject mo)
{
mo.Name = "Test2";
mo.Values.Add("Value4");
}
public MyObject ChangeObjectReturnValue(MyObject mo)
{
mo.Name = "Test2";
mo.Values.Add("Value4");
return mo;
}
public void ChangeMyObject()
{
MyObject mo1 = new MyObject()
{
ID = 1,
Name = "Test",
Values = new List<string>(){
"Value1", "Value2", "Value3"
}
};
MyObject mo2 = new MyObject()
{
ID = 1,
Name = "Test",
Values = new List<string>(){
"Value1", "Value2", "Value3"
}
};
ChangeObjectByRef(mo1);
mo2 = ChangeObjectReturnValue(mo2);
Console.WriteLine(mo1.ToString());
Console.WriteLine(mo2.ToString());
}
public class MyObject
{
public int ID { get; set; }
public string Name { get; set; }
public List<string> Values { get; set; }
public override string ToString()
{
return string.Format("[ID={0}, Name={1}, Values={2}", ID, Name, string.Format("[{0}]", string.Join(", ", Values)));
}
}
结果是相同的(明显)。但是这两种方法有什么区别吗?
代码示例',而对象是运输ByRef'号*所有*值是按值传递,除非明确标有'ref'或'out'。一个引用类型的值只是一个引用,然后被复制。这是一个非常不同的语义。 – Servy
如果您想知道是否存在性能差异,请运行代码并自行找出。 – Servy
不应该将'mo2'传递给'ChangeObjectReturnValue'吗?否则,你只是将'mo1'的更新版本分配给'mo2'并丢失你创建的第二个'MyObject'。 – juharr