2011-01-11 6 views
2
public int Age { get; set; } 

OR 

public int Age; 

이 새 Person을 만드는 경우. 위의 두 줄은 정확히 똑같습니까?C# 구문 질문

+1

아니요, 첫 번째 속성은 속성이고 두 번째 속성은 공용 인스턴스 변수입니다. –

답변

10

맞지 않습니다. 첫 번째 행은 자동 구현 된 속성이고 두 번째 행은 공용 입력란입니다. 그것들은 바이너리 호환이 아니며 의미 적으로도 똑같은 것은 아닙니다. 일반적으로 속성은 융통성 및 데이터를 캡슐화하기 위해 을 사용할 수 있다는 점에서 선호됩니다 (종종 악용 되기는하지만).

그러나 컴파일러에서 생성되는 항목과 관련하여이 속성은 자동 백업 필드와 본질적으로 액세스 할 수있는 두 개의 메서드 ("getter"및 "setter")를 만듭니다. 필드는 바로 그것입니다 : 필드.

으로 인해 두 가지 예는 다르게 동작합니다 여러 가지 방법으로 사실 거기 이러한 차이 : 속성은 UI 응용 프로그램에서 데이터 바인딩을 지원합니다

  1. 가.
  2. 필드는 Interlocked 메소드 중 하나와 같이 ref 또는 out 매개 변수로 액세스 할 수 있습니다.
  3. int 대신 가변 값 유형 (예 : Point)이있는 경우이 속성을 사용하면 필드 복사본을 반환하므로 값을 직접 수정할 수 없습니다. 필드를 수정하려면 속성에서 반환 한 값을 로컬 변수에 할당하고 로컬을 수정 한 다음 다시 속성에 할당해야합니다.이 필드를 사용하면 실제로 값을 올바르게 수정할 수 있습니다. 보조 노트로

는 점 3 위의 많은 개발자들이 가변 값 유형을 설계 에 대해 주장하는 데 사용하는 행위의 유형의 예입니다.

1

아니요 - 첫 번째 필드는 속성이고 두 번째 속성은 속성입니다. 가능하면 속성을 사용하여 나중에 확장 할 수 있습니다. 즉 설정 도구에서 일부 데이터 유효성 검사를 추가 할 수 있습니다. 속성은 배경 필드를 사용합니다. 자동 속성은이 속성을 숨 깁니다. 여기

속성 세터 내에서 데이터 유효성 검사의 예 : 대신 필드의 속성을 사용하는 주된 이유 중

한 응용 프로그램이나 라이브러리의 버전입니다 - 당신이 속성을 사용하는 경우 클래스 나 라이브러리 사용자가 코드를 다시 컴파일하지 않아도 속성 구현을 변경할 수 있으므로 클래스의 공용 인터페이스는 동일하게 유지됩니다. 반면에 필드에서 속성으로가는 것은 최악의 경우 최악의 경우 변경 될 수 있습니다 (Dao의 목록 참조, 필드를 ref로 사용). 적어도 재 컴파일이 필요합니다.

0

아니요, 이들은 동일하지 않습니다.

첫 번째 속성은 getter 및 setter 메서드와 함께 다른 백업 변수가 만들어지는 속성입니다. 이들은 보이지 않을 것입니다. 이 메서드는 getter 및 setter 클래스의 기능을 쉽게 변경할 수 있기 때문에 사용해야합니다. Visual Studio에서 필드를 속성으로 변환하는 것은 매우 간단하기 때문에 쉽게 사용해야합니다.

둘째 매개 변수는 public 일뿐입니다. 모두들 캡슐화를 깨기 때문에 나쁜 생각입니다.

+0

아니요, 외부 코드와 동일하게 작동하지 않는 것 같습니다. 참조로 속성을 전달하거나 바인딩하십시오 ... –

+0

Ah thanks. 나는 반례문을 생각하려고 애썼고, 실패한 후에야 그것을 게시했다. 나는 그것을 제거 할 것이다. – Tesserex

0

다른 위치의 실제적인 예제를 제공하기 위해 두 번째 버전은 컨트롤에 직렬화되거나 데이터 바인딩되지 않지만 첫 번째 버전은 컨트롤이 될 수 있습니다. This bit me on the ass before.

0

첫 번째 요소는 자동 속성이고 두 번째 요소는 "대문자"멤버 변수입니다. 캡슐화는 첫 번째를 선호합니다. 첫 번째 경우에는 설정 및 가져 오기에 대한 코드 포인트가 있지만 비어 있습니다.