2013-09-27 6 views
0

매우 간단한 질문 ... 구조에서 개인용 백킹 필드를 올바르게 초기화하는 방법은 무엇입니까? 컴파일러 오류가 발생합니다.컴파일러에서 생성 된 백킹 필드로 구조를 초기화하는 방법

Backing field for automatically implemented property 'Rectangle.Y' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

소스 코드를 참조하십시오.

public struct Rectangle 
{  
    public Rectangle(int x, int y, int width, int height) 
    { 
     X = x; 
     Y = y; 
     Width = width; 
     Height = height; 
    } 
    public int Width { get; private set; } 
    public int Height { get; private set; } 
    public int X { get; private set; } 
    public int Y { get; private set; } 
} 
+0

어디에서 오류가 발생합니까? –

답변

4

이것은 구조체에서 자동으로 구현되는 속성을 사용하는 경우 발생하는 문제입니다. 당신은 명시 적으로 매개 변수가없는 생성자 체인해야합니다

public Rectangle(int x, int y, int width, int height) : this() 
{ 
    X = x; 
    Y = y; 
    Width = width; 
    Height = height; 
} 

컴파일러는 각 속성을 설정하면 관련 필드를 설정합니다 것을 "알고"하지 않습니다 - 그것은 볼 필요가있는 모든 필드 (이 당신이 할 수있는 ' 자동 생성되기 때문에 명시 적으로 액세스)이 할당됩니다. 다행히 매개 변수없는 생성자가이를 수행합니다. 개인적으로

난 그냥 실제 읽기 전용 필드 대신 수동 속성, 마음을 사용하는 거라고 :

public struct Rectangle 
{  
    private readonly int x, y, width, height; 

    public int X { get { return x; } } 
    public int Y { get { return y; } } 
    public int Width { get { return width; } } 
    public int Height{ get { return height; } } 

    public Rectangle(int x, int y, int width, int height) 
    { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 
} 

전 C#은 "정말"읽기 전용 자동으로 구현 된 속성을 선언하는 방법이 있었으면 좋겠다 있도록 호텔은 전용 수 생성자에서 호출되고 읽기 전용 필드에 쓰기로 직접 변환되지만 염두에 두지 마십시오.

1

기본 생성자를 체인 호출하면 (컴파일러를 만족하는 기본 필드가 초기화됩니다) 그 오류를 피할 수 있습니다.

public Rectangle(int x, int y, int width, int height) 
    : this() 
{ 
    // ... 
0

필드가 아닌 자동 속성을 사용해야하는 특별한 이유가없는 경우 공개 필드를 사용하기 만하면됩니다. 클래스 속성은 필드가 제공 할 수없는 유용한 작업 (예 : 업데이트 알림 지원)을 수행 할 수 있으며, 클래스 유형의 자동 속성을 사용하여 시작하는 대신 필드가 아닌 추가 기능이 필요할 경우 나중에 실제 속성을 사용하기가 쉽습니다. 변경 가능한 구조 속성은 실제로 클래스 속성과 관련된 이점을 제공하지 않습니다. 주어진 선언 :

SomeStructure foo,bar; 
... 
foo = bar; 

마지막 문이 관련된 코드없이, bar의 모든 상태 캡처의 공공 및 민간 분야, 그리고 foo의 모든 그 내용으로 덮어의 공공 및 민간 분야 것 SomeStructure은 그것을 막을 수있는 능력을 가지고 있었고 심지어 그것이 일어났다는 것을 알 수있었습니다. 구조체의 의미에 따라 멤버가 각 유형에 유효한 값의 조합을 보유 할 수있는 경우 필드가 아닌 속성을 사용하면 일부 작업의 편의성이 떨어지며 (문제가되는 초기화 등) 기본적으로 보호 또는 기타 이점을 제공하지 않습니다 말하기.