이번엔 간혹 놓칠때가 있는 기초적인 내용에 대해 적어 보겠습니다.
c#에서 struct를 property로 사용할 때 주의 해야할 점이 있습니다.
internal class Program
{
static void Main(string[] args)
{
var test = new TestClass();
test.Foo();
}
}
public class TestClass
{
public TestStruct Val1 { get; set; }
public TestStruct Val2;
private TestStruct _val;
public TestStruct Val3
{
get { return _val; }
set { _val = value; }
}
public void Foo()
{
Val1.SetValue();
Console.WriteLine(Val1.Value);
Val2.SetValue();
Console.WriteLine(Val2.Value);
Val3.SetValue();
Console.WriteLine(Val3.Value);
_val.SetValue();
Console.WriteLine(Val3.Value);
}
}
public struct TestStruct
{
public int Value;
public void SetValue()
{
Value = 10;
}
}
위 소스를 실행 했을 때 결과가 예상 되시나요?
10
10
10
10
이 나올거 같지만
실제 결과는
0
10
0
10
이 나옵니다.
원인은 c# 에서 property의 get은
참조 타입의 경우 해당 참조를 그대로 전달 하지만
값 타입의 경우 복사본을 전달 하게 됩니다.
Val1.SetValue(); 의 경우
복사 된 임시 TestStruct 의 Value 를 10으로 설정 한것이기 때문에
실제 Val1의 Value는 변화가 없습니다.
하지만 set은 실제 property에 저장 되므로
헤깔리지 않도록 주의 해야 합니다.