2010-06-19 4 views
1

구조체가 값 형식을 알고 있지만 왜 작동하는지 이해할 수 없습니다.
EDIT : 왜 this.Size.Height가 작동하지 않는 이유는 무엇입니까?C# - 2 구조체 질문

struct A 
{ 
    int height; 

    public int Height 
    { 
     get 
     { 
      return height; 
     } 

     set 
     { 
      height = value; 
     } 
    } 
} 

//... class Main 
{ 
    A a = A(); 
    a.Height = 5; //works. Why? I thought it should say "cannot modify as it is not variable". I think the properties should return copy of this struct...? 
} 

두 번째 질문 - 내가 구조체와 "새"를 사용할 필요가 없습니다 읽었지만 나를 위해 그것없이 작동하지 않습니다.

+0

두 가지 질문이있는 경우 질문을 두 개 이상 결합하지 말고 * 두 개의 질문을 게시하는 것이 좋습니다. 그런 식으로 모든 질문에는 확실한 답이 있습니다. –

답변

1

"this.Size.Height = 5"는 값 유형이 속성의 유형으로 사용될 때 위의 코드 행이 실제로 "this.get_Size(). set_Height (5)"를 의미하므로 작동하지 않습니다. get_Size() 호출의 결과는 원래 값 유형 인 복사본입니다.

따라서 C#에서 허용 되었습니까? 속성 값을 5로 설정하면 원래 속성 값보다는 복사본 값이 변경되므로 매우 바람직하지 않습니다.

물론이 것은 로컬 변수를 통해 클래스의 값 유형 속성이 변경된 경우에는 적용되지 않으므로이 시나리오를 안전하게 지원할 수 있습니다.

3

당신은 불변의 가치 유형을 혼란스럽게 생각합니다. 제 생각에는 this SO question이 도움이 될 것 같습니다.

1

매우 정상입니다. 왜 당신이 높이에 대한 가치를 설정하게해서는 안된다고 생각합니까? 속성이 작동하는 방식은 매우 정상적인 동작입니다. new을 호출하는 경우 값 유형에 필수 항목은 아닙니다. 값 유형의 경우 기본값으로 필드를 초기화하는 기본 생성자 만 호출합니다.

0

속성은 "get"메서드가 반환하는 값을 반환합니다. 구조체와 클래스의 경우도 마찬가지입니다. "set"메소드를 제공하면 "set"이 나타내는 모든 것을 수행합니다. 높이를 수정할 수없는 유일한 방법은 개인 "세트"를 사용하거나 "세트"를 제공하지 않는 것입니다.

6

나에게 몇 가지 질문에 그를 분해하자

변수는 무엇입니까?

변수는 값이 들어있는 저장 위치입니다.

값 유형이 값 유형이라고하는 이유는 무엇입니까?

값 형태의 변수 값은 값이며, 값으로 복사된다. 참조 유형 변수의 값은 참조이고 참조으로 복사됩니다. 그래서 값 유형을 값 유형이라고하고 참조 유형을 참조 유형이라고합니다.

왜 a.Height = 10입니까?

참조 유형의 변수에 저장된 값을 변경하려면 먼저 변수가 있어야합니다. 이 경우 변수 "a"가 있습니다. 컴파일러는 "변수 'a'의 관리 주소를 인수 10을 사용하여 높이 설정기에 전달합니다.따라서 Height 속성 설정자는 'a'에 저장된 값의 위치를 ​​찾고이를 변경하는 방법을 알고 있습니다.

a.Size.Height = 10이 작동하지 않는 이유는 무엇입니까?

참조 유형의 변수에 저장된 값을 변경하려면 먼저 변수가 있어야합니다. 표현 "a.Size"는 변수가 아닙니다. 그것은 가치입니다. a.Size는 속성을 뒷받침하는 변수를 제공하지 않습니다. 실제로는 속성이 없을 수도 있습니다. 대신, 그것은 당신에게 속성의 가치를 제공합니다. 값 유형은 값으로 복사됩니다. 이 속성 값의 복사본입니다. 즉, 컴파일러에는 두 가지 선택 사항이 있습니다. 즉, 임시 변수에 값을 복사 한 다음 해당 변수를 변형 시켜서 .Size의 백업 저장소를 변경했다고 생각하게 만들 수 있습니다. 또는, 그것은 당신에게 뭔가 어리석은 짓을한다는 오류를 줄 수 있습니다. 그것은 후자를한다.

혼란스럽지 않습니까?

예. 이야기의 도덕은 입니다. 변경 가능한 값 유형은이 아닙니다. 은 변경할 수없는 값 유형 만 지정하십시오. 처음에는 값 유형에 대한 설정자를 절대 사용하지 마십시오. 생성자에서 할당 만 수행하십시오. 변수가 변경 가능해야하는 경우 참조 유형으로 지정하십시오.

값 유형의 새 인스턴스를 만들려면 "new"를 사용해야합니까? 또한 "기본"을 사용할 수 있습니다

번호 :

Foo f = default(Foo); 

푸 다음이로 설정 모든 필드가 푸와 f를 저장 위치의 내용을 채 웁니다 값 형식 인 경우 자신의 기본값.

값 유형이 변경 가능하면 모든 필드의 값을 간단히 설정할 수 있습니다. 그러나 생성자 또는 기본 이니셜 라이저를 사용하지 않는 경우 을 모두으로 설정해야합니다. 전용 필드을 포함하여 모두 을 설정해야합니다.

구조체에 공용 필드가 모두있는 경우 모범 사례 지침을 위반하지 않는 방법은 두 가지가 있습니다. 첫째, public 필드를 가지고 있기 때문에 둘째, 그것은 가변 값 유형이기 때문에?

예. 그러지 마.