2016-06-16 1 views
1

http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx에서 다음 코드를 보자C#에서는 필드를 사용하여 자동 구현 된 속성을 사용하면이 경우 다른 동작이 발생하는 이유는 무엇입니까?

using System; 

struct MutableStruct 
{ 
    public int Value { get; set; } 

    public void SetValue(int newValue) 
    { 
     Value = newValue; 
    } 
} 

class MutableStructHolder 
{ 
    public MutableStruct Field; 
    public MutableStruct Property { get; set; } 
} 

class Test 
{  
    static void Main(string[] args) 
    { 
     MutableStructHolder holder = new MutableStructHolder(); 
     holder.Field.SetValue(10); 
     holder.Property.SetValue(10); 

     Console.WriteLine(holder.Field.Value); 
     Console.WriteLine(holder.Property.Value); 
    } 
} 

(앞에서 놓친 또는 지금 밖으로 찍은 것을 읽어 보지 않았 코드에 주석의 부부가 있었다.)

주장에를 그 기사는 출력이 holder.Field 인 경우 10이지만 holder.Property 인 경우 0이고 정확한 것으로 확인되었습니다. 나는 왜 그런지 보는데 약간의 어려움을 겪고있다. 자동 구현 된 속성은 구조체가되기 때문에 하나의 특정 필드를 매핑 할 수 있습니다. 구조체이므로 Property은 즉시 처음부터 완전히 지원 및 설정되는 보조 필드를 갖게됩니다. 차이점이 뭐야?

+4

당신은 이미 차이점이 있습니다, 당신은 코멘트에 적어 두었습니다. 필드의 값을 돌연변이시키고 있지만 속성에서 복사본을 얻고 복사본을 변경하려고합니다. –

답변

5

라인 holder.PropertyMutableStruct 사본을 반송합니다. 따라서 holder.Property.SetValue(10)이라고 쓰면 원본이 아닌 사본이 변경됩니다.

라인 holder.FieldMutableStruct 그 자체의 별칭입니다.

실수로 구조체의 복사본을 만드는 것이 어렵습니다. 따라서 우리는 그들을 변경할 수 없도록하려고 노력합니다.

+0

P. .NET으로 작업 한 지 14 년이 넘었을 때 프로덕션 응용 프로그램에서 하나의 변경 가능한 구조체 만 호출 할 수있었습니다. 그 이유는 myArray.ToArray()가 각 요소의 사본을 만들길 원했기 때문입니다. –

4

차이점은 속성에 대한 getter의 영향입니다. 그것은 그래서 당신은 당신이 Field직접에서 구조체를 돌연변이 있습니다

holder.Field.SetValue(10); 

를 호출 할 때

private MutableStruct _Property; 
public MutableStruct GetProperty() 
{ 
    return _Property; 
} 
public void SetProperty(MutableStruct value) 
{ 
    _Property = value; 
} 

기능적으로 동일하지만 당신이

holder.Property.SetValue(10); 

를 호출 할 때 당신은 사본을 돌연변이된다 구조체의GetProperty에서 반환되었습니다.

+0

일리노이 속성을 보면 실제로는'X get_Property()'와'void set_Property (X value)'... 같은 방법으로 컴파일됩니다. 그러나 여러분의 요점은 같습니다 :) –

+2

@MatthewWhited 그래서 제가 동등한 말을했습니다. 컴파일러 생성 이름은 부적합합니다. –

관련 문제