2014-03-29 2 views
0

자동 구현 된 속성을 사용한다고 가정 해 보겠습니다.자동 구현 된 속성의 경우 개인 변수를 만들 수 있습니까?

예 : 코드 위

public class Test { 
    public int val1 { get; set; } 
} 

가 자동으로 private 변수라는 생성 : private int val1

내 질문은 우리가 명시 적으로 자동 구현 속성 코드 위의이 변수를 선언하는 경우 어떤 일이 발생한다는 것입니다?

예 :

public class Test { 
    private int val1; 

    public int val1 { get; set; } 
} 

두 예는 동일?

+0

시도해 보셨습니까? 두 번째 컴파일은 전혀 완료 되었습니까? – GolezTrol

답변

1

미안하지만 너 세트가 잘못되었습니다. 자동으로 구현 된 속성 val1의 뒷받침 필드는 val1이 아닙니다. ildasm과 같은 디 컴파일러를 사용하여 간단히 테스트 할 수 있습니다. here을 보시기 바랍니다.

둘째, 같은 이름의 속성과 개인 변수를 선언 할 수 없습니다. 따라서 두 번째 예는 정확하지 않습니다. Visual Studio에 입력하려고하면 해당 오류 메시지가 나타납니다.

1

두 번째 코드 스 니펫은 중복 된 멤버 이름으로 인해 컴파일되지 않습니다. 속성 이름은 사용자가 선언 한 필드의 이름과 충돌합니다.

3

컴파일러에서 생성 된 배경 필드 이름이 val1으로 지정되지 않았습니다. 해당 변수의 이름은 코드를 인터럽트 할 수없는 방식으로 작성되므로 걱정할 필요가 없습니다.

C#에서 잘못된 식별자를 만드는 방식으로 백킹 필드 이름이 생성되지만 CLR 사양에서는 정상입니다. 그래서 코드를 중단시키지 않습니다. 코드를 다음을 잘 컴파일 이유

:

class Test 
{ 
    private int _val1; 
    private int val1; 
    public int Val1 { get; set; } 
} 

을 그리고 당신은 IL 보면 그런 클래스 생성, 당신은 Val1 동안 그 백업 필드를 볼 수는 다음과 같습니다

.field private int32 '<Val1>k__BackingField' 

<Val1>k_BackingField은 C#에서는 잘못된 식별자이지만 CLR에서는 정확합니다.

1

두 번째 이름은 중복되어 컴파일되지 않습니다. 생성 된 멤버 변수는 사용자가 생성 한 새로운 멤버 변수와 충돌하지 않으며 컴파일러는이를 보장합니다. 원하는 경우 다음과 같이 할 수 있습니다.

public class test 
{ 
    Public int val1{ get; private set;} 
} 

즉 setter를 비공개로 설정합니다. 그러나 실제로 달성하기를 원하는 것이 명확하지 않습니다.

1

두 번째 코드는 속성 또는 필드 이름을 변경 compile.If하지 않습니다, 그것은 그들이 완전히 다른 things.Compiler 여전히 자동 구현 속성의 백업 필드을 만듭니다 될 compile.And 것 그래서 당신의 재산과 분야 사이에는 아무런 관계도 없습니다.

관련 문제