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