2010-04-07 2 views
3

"a"가 입력 된 값으로 인해 작동하지 않는 다음 코드가 있습니다. 하지만 접근 자 없이도 작동하지 않을 것이라고 생각했지만 그랬습니다 :빈 접근자는 중요합니까? 값 유형 및 해당 수정에 대해

"a"가 구조체이므로 작동하지 않습니다. 하지만 "_a"인스턴스에서 접근자를 삭제하면 작동합니다. 나는 왜 그런지 이해하지 못한다. 감사합니다.

+0

접근자를 삭제할 수 없습니다. 사용자 정의 접근자를 기본 구현으로 대체 한 것입니다. –

+0

나는 _a를 얻을 수있다; 용이하게. 그리고 컴파일됩니다. – Petr

+0

몇 가지 팁 : 1) 더 나은 이름을 사용하십시오. 2) 구조체 대신 클래스를 사용하십시오. 3) 구조체를 사용하는 경우 불변으로 디자인하십시오. –

답변

2

값 유형의 주요 기능은 참조로 전달되는 것이 아니라 복사된다는 것입니다. 만약 값 유형, 접근이 때

하면 본질적 값 유형이 복사시키는 방법에서 반환되고있다 (아래의 두 가지 예와 동일하다)

ValueType Property { get { return x; } } // Will make a copy of x 
ValueType Method() { return x; } // Will make a copy of x 

하면 만약 이제 반환 된 값에 할당하면 사본 x에 할당됩니다. 따라서 속성에서 반환 된 값에 대한 변경 사항은 즉시 손실됩니다.

{get;

int field; 

또는 필드에 할당 할 때 의미한다 어떤 사본을 의미

ValueType field; 

, 더 이상 할당 위치 :} 접근, 당신은 지금, 예를 들어, 기본 필드가있어 사본.

+0

첫 번째 줄이 잘못되었습니다. 그 대답의 나머지 부분은 OK입니다. 값/참조 유형 간의 주요 차이점은 값/참조 유형을 복사 할 때 발생합니다. 스택/힙이 아닙니다. –

+0

좋아,하지만 그걸 읽었습니다. 설정; 기본적으로 구현됩니다. 그러나 그것이 사실이라면 컴파일되지 않을 것입니다. – Petr

+0

@Henk : 나는 누군가가 나를 데리러 올 줄 알았습니다.) 진실은 스택에 할당되었습니다. 변경됨. – Grokys

1

두 접근자를 모두 삭제할 수 없습니다.

이 방법 :

a _a; 

그것은 작동하지만, 더 이상 속성이 아니다.


편집 : 속성을 사용하면 p._a에서 가져온 값은 함수 호출의 결과입니다. 심지어 수정하면 수정 된 값이 "원래"_a에 "쓰여지는"것이 아닙니다. 대신 getter-function에 의해 반환 된 임시 변수를 수정하면됩니다.

C#은 이것을 허용 할 수 있지만, 사람들이 p._a.X = 5; int xx = p._a.X; 이후에 xx 값이 5가 될 것으로 예상하기 때문에 혼동을 일으킬 수 있습니다. 그러나 그렇게되지는 않습니다. p_.a 실제로 변수 :-)


차이가 아니기 때문에

a _a; 

당신의 _a와 필드이다; 경우의 경우

_a은 속성입니다. 그리고 케이스

a _a { } 

는 허용되지 않습니다.

+0

예, 삭제되었지만 struct를 다음과 같이 수정할 수 있습니다 : p._a.X = 5 그리고 "X is not variable"이 더 이상 없습니다. – Petr

+0

실제로. 프로퍼티의 경우, p._a는 함수 호출이며, 수정할 수없는 값을 반환합니다. 변수에 할당하고 수정할 수 있습니다 : 'a new_a = p._a; new_a.X = 5;' – Vlad

+0

이야기에 가치가 없기 때문에 '_a'의 'value'를 수정할 수 없다는 이야기입니다. 속성이므로 함수에 의해 반환되므로 변경 사항은 '프로그램'클래스에서 발견되지 않습니다. – Vlad

1

p._a.X = 5;이 작동하지 않는 이유는 p._aa 유형의 값을 반환하기 때문입니다. 값을 변경할 수 없습니다. 그러나 변수에 값을 넣으면 변수 값을 변경할 수 있습니다.