2016-09-15 54 views
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))); 
     } 
    } 

結果是相同的(明顯)。但是這兩種方法有什麼區別嗎?

+8

代碼示例',而對象是運輸ByRef'號*所有*值是按值傳遞,除非明確標有'ref'或'out'。一個引用類型的值只是一個引用,然後被複制。這是一個非常不同的語義。 – Servy

+4

如果您想知道是否存在性能差異,請運行代碼並自行找出。 – Servy

+0

不應該將'mo2'傳遞給'ChangeObjectReturnValue'嗎?否則,你只是將'mo1'的更新版本分配給'mo2'並丟失你創建的第二個'MyObject'。 – juharr

回答

1

您實際上未使用值類型,有關值類型的詳細信息,請參閱link。你實際傳遞的是一個指向該對象的指針,而不是對象本身。因此,擴展@juharr在評論中提到的內容,你會失去mo2,因爲你用第一個對象的指針覆蓋它。見什麼將實際發生


class Program 
    { 
     static void Main(string[] args) 
     { 
      Demo demo = new Demo { A = "ABC" }; 
      Demo demo2; 
      OptionOne(demo); 
      Console.WriteLine(demo.A); //Outputs World 
      demo2 = OptionTwo(demo); 
      Console.WriteLine(demo.A); //Outputs Hello 
      Console.WriteLine(demo2.A); //Output Hello 
      Console.ReadKey(); 
     } 

     private static void OptionOne(Demo demo) 
     { 
      demo.A = "World"; 
     } 
     private static Demo OptionTwo(Demo demo) 
     { 
      demo.A = "Hello"; 
      return demo; 
     } 
    } 
    public class Demo 
    { 
     public string A { get; set; } 
    }
相關問題