2016-09-15 6 views
0

C# 값 형식은 ByVal을 전송할 때 개체의 매개 변수로 사용할 때 ByValue를 전송하므로 ByRef가 전송됩니다. 그래서 내 질문은 : 더 나은 (빠른/더 performant/적은 메모리) 소요됩니다 무엇입니까?개체를 우회하는 가장 효율적인 방법 - 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'No * 모든 * 값은 명시 적으로'ref '또는'out '으로 표시되지 않는 한 값으로 전달됩니다. 참조 유형의 값은 단순히 참조이며 이는 복사됩니다. 그것은 매우 다른 의미입니다. – Servy

+4

성능 차이가 있는지 알고 싶으면 코드를 실행하고 직접 찾으십시오. – Servy

+0

'ChangeObjectReturnValue'에'mo2'를 넘겨 주실 래요? 그렇지 않으면'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; } 
    }