많은 사람들이 여기에서 혼란스러워하고 있다고 생각합니다. 이 특별한 문제는 값 유형 속성 이 값 유형 의 복사본을 반환하고 메서드 및 인덱서와 마찬가지로 값 유형 필드 에 직접 액세스 한다는 것을 이해하는 것과 관련 이 있습니다 . 다음 코드는 속성의 백업 필드에 직접 액세스하여 달성하려는 작업을 정확하게 수행합니다 (참고 : 백업 필드를 사용하여 자세한 형식으로 속성을 표현하는 것은 자동 속성과 동일하지만 코드에서 우리가 할 수있는 이점이 있습니다) 지원 필드에 직접 액세스) :
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //succeeds
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
_origin.X = 10; //this works
//Origin.X = 10; // fails with CS1612;
}
}
오류가 발생하면 속성이 값 형식의 복사본을 반환한다는 것을 이해하지 못해 간접적으로 발생합니다. 값 유형의 사본이 리턴되고이를 로컬 변수에 지정하지 않으면 해당 사본에 대한 변경 사항을 읽을 수 없으므로 컴파일러는이를 의도하지 않으므로 오류로 발생시킵니다. 복사본을 로컬 변수에 할당하면 X 값을 변경할 수 있지만 로컬 복사본에서만 변경되어 컴파일 시간 오류를 수정하지만 원점 속성을 수정하는 원하는 효과는 없습니다. 다음 코드는 컴파일 오류가 발생했지만 디버그 어설 션이 실패하기 때문에이를 보여줍니다.
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //throws error
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
var origin = Origin;
origin.X = 10; //this is only changing the value of the local copy
}
}