문제

자동 구현 된 적절한 기능을 사용하는 간단한 클래스가 있습니다.

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

나는 분명히 수업 내내 변수 barname을 사용하고 이제 속성 값이 설정 될 때 논리를 추가해야합니다 (모두 혹독한 경우, GO 그림). 이것은 이제 Barname (예 : _barname)에 대한 개인 변수를 만들고 클래스 전반에 걸쳐 사용되는 현재 Barname 변수를 _barname으로 변경해야한다는 것을 의미합니까?

Public Class foo
{
    public foo() {}  

    private string _BarName = "";
    public string BarName 
    { 
        get {return _BarName;}
        set {_BarName = Value.ToString().ToUpper();}
    }
}

자동 구현 속성을 사용하는 의미와 무언가를 변경 해야하는 경우 도로를 수반하는 내용을 이해하려고 노력하고 있습니다. 위에서 볼 수 있듯이 리팩토링이 파괴 속성이 기본적으로 동일하게 유지되기 때문에 변경됩니다. 수업 내에서 그런 식으로 유지하고 필요한 논리를 추가하기 위해 약간의 작업이 필요했습니다.

더 의미가있을 수있는 또 다른 예는 세터 나 getter를 사용할 때 어떤 방법을 호출해야한다는 것입니다. 더 많은 것보다 가치를 바꾸십시오.

이것은 설정 속성에 대한 코드 라인과 코드 라인을 공정한 거래로 보입니다.

도움이 되었습니까?

해결책

이것은 이제 Barname에 대한 개인 변수를 만들어야한다는 것을 의미합니까?

내 수업 내내 사용 된 현재 Barname 변수 변경

클래스의 나머지 코드를 변경하여 생성 한 새로운 개인 변수를 사용하지 마십시오. BARNAME, 속성으로서, 나머지 코드에 대해 생각하는 스위프 변경 사항을 피하기 위해 개인 변수 (무엇보다도)를 숨기려는 것입니다.

나는 위에서 볼 수 있듯이, 재산이 기본적으로 동일하게 유지되기 때문에 리팩토링이 깨진 변화가 아니라고 가정한다. 그런 식으로 유지하고 필요한 논리를 추가하는 데 약간의 작업이 필요했습니다.

옳은.

다른 팁

아무것도 바꿀 필요가 없습니다. 자동 이식 된 특성은 단지 구문 설탕입니다. 컴파일러는 비공개 변수를 생성하고 무대 뒤에서 당신을 위해 논리를 얻습니다. 자신의 getter/setter logic을 추가하면 컴파일러는 자동 생성 코드 대신 코드를 사용하지만 사용자 그 재산 중에서는 아무것도 바뀌지 않았습니다. 귀하의 재산을 참조하는 모든 코드는 계속 작동합니다.

자동 속성을 사용할 때는 기본 "백킹"변수에 직접 액세스 할 수 없으며 속성 getter 및 setter에서 구현되는 실제 논리에 액세스 할 수 없습니다. 속성에만 액세스 할 수 있습니다 (따라서 코드 전체에서 Barname을 사용).

이제 세터에서 특정 논리를 구현 해야하는 경우 더 이상 자동 속성을 사용할 수 없으며 "구식"방식으로 속성을 구현해야합니다. 이 경우 자신의 개인 백업 변수를 구현해야합니다 (적어도 나에게 선호되는 방법은 개인 백업 변수를 속성과 동일한 이름으로 지정하지만 초기 소문자 인 경우 백업은 백업입니다. 변수의 이름은 Barname)입니다. 그런 다음 Getter/Setter에서 적절한 논리를 구현합니다.

당신의 예에서, 당신은 그것이 깨지는 변화가 아니라는 것이 맞습니다. 이러한 유형의 리팩토링 (자동 속성에서 "정상"속성으로 이동하는 것은 공개 인터페이스 (공공 재산의 이름 또는 접근성)를 변경하지 않기 때문에 결코 깨진 변화가되어서는 안됩니다.

해당 객체를 검증 할 것이라는 것을 알고 있다면 자동 속성을 사용하지 마십시오. 이 객체는 도메인 객체 등이 될 수 있습니다. 고객 클래스가있는 경우 이름, 생년월일 등을 검증해야하므로 개인 변수를 사용하는 경우 RSS 클래스를 사용하는 경우 자동 속성을 사용하는 것만으로도 괜찮습니다. 검증이 수행되지 않고 클래스가 일부 데이터를 보유하는 데 사용되기 때문에.

당신은 리팩토링에 대해 맞고 실제로 아무것도 깨지 않아야합니다.

실제로 클래스 내 참조를 속성 이름으로 거쳐야하고 개인 필드를 참조하도록 변경 해야하는지 여부는 데이터의 기본 표현에 필요한 내부 코드가 제시된 방법보다는 데이터의 기본 표현에 액세스하는 데 필요한지 여부 수업의 소비자. 대부분의 경우 당신은 충분히 혼자서 떠날 수 있습니다.

간단한 예에서는 충분히 혼자서 남겨두고 클래스 내부의 코드가 세터에서 수행되는 변환/서식을 파괴 할 수 없도록하는 것이 현명합니다.

반면에 Getter가 소비자가 데이터를 보는 데 필요한 방식으로 필드의 내부 표현을 변경하기 위해 약간의 마법을하고 있다면 클래스 내의 내부 코드가 필드에 액세스해야 할 수도 있습니다.

클래스의 자동 프로퍼에 대한 액세스가 발생하는 각 발생을보고 필드에 닿거나 속성을 사용해야하는지 결정해야합니다.

자동 특성은 단지 구문 설탕 일뿐입니다. 컴파일러는 실제로 개인 구성원을 생성하지만 컴파일 시간에 생성되므로 액세스 할 수 없습니다.

그리고 나중에, 당신이 속성에 대한 getters and setter를 구현하려면, 당신은 그것에 대한 명시 적 개인 멤버를 만들고 논리를 추가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top