4

나는 C #클래스를 작성했다.

코드 리팩터가 제안한이 제안을 발견했습니다. 그리고 나는 didnt한다.

이 제안 / 개선을 제안했을 때이 도구가 의미하는 바를 정확하게 얻으십시오.

상황 :

this.Text 속성을 사용하여 Form 클래스의 생성자에서 제목을 설정했습니다.

Form()
{
   //some initialization code ...

   //...

   this.Text = "Non modal form";           //Suggestion offered here..
}

코드 리팩터 툴은 경고 메시지를 표시합니다.

이 문제를 해결하기 위해 도구가 자동으로 속성을 추가했습니다.

  public override sealed string Text
   {
        get { return base.Text; }
        set { base.Text = value; }
   } 

아무도 날 봉인 된 속성을 추가하는 방법에 영향을줍니다 / 상황을 개선하는 방법을 설명 할 수 있습니다.

건배

4 답변


5

생성자에서 가상 멤버를 호출하고 있습니다. 클래스가 상속되고 해당 속성이 호출되면 코드가 실행됩니다. 이것을 봉인하면 (자), 아이 클래스에서 오버라이드 (override) 할 수 없기 때문에, 이것을 막습니다. 이 특정 예제에서는 영향을 미치지 않습니다.



1

파생 클래스가 없기 때문에 도움이 될 것입니다.override그것.


1

당신이Form, 다른 옵션은 초기화 코드를Load이벤트 핸들러 (Jon Skeet이리) :

Load += delegate
{
    this.Text = "Non modal form";  
};

Load 이벤트를 사용하면 봉인 된 속성을 만드는 것보다 훨씬 간단합니다. 특히 둘 이상의 가상 속성에 액세스하는 경우 특히 그렇습니다.


1

당신이virtual속성을 생성자에서 사용하는 경우 리팩토링 도구는 속성을 봉인하여상속 된 클래스에서 값을 변경할 수 없습니다.상속 된 클래스에서 재정의 할 수 없습니다.

이것은 성능을 향상시키지 않으며 당신이 가지고있는 시나리오에서 의미가 없습니다 (Form).그래서 나는 그것을 무시할 것이다..


  • 이것은 상속 된 클래스가 프로퍼티의 값을 변경하는 것을 막지 않습니다. 상속 된 클래스가행동재산의. - Adam Robinson
  • 또한 아직 생성되지 않은 클래스 (상속 된 클래스)에서 코드가 실행될 수 있으므로 생성자 내에서 가상 멤버를 호출하는 것이 바람직하지 않기 때문에 여기에서 제안합니다. - Adam Robinson
  • 이것은 기본 클래스에서 오버라이드 될 수 없습니다. 이것은 baheviour가 아니니까 ?? - Aliostad
  • 내가 당신에게 묻고있는 것이 확실하지 않습니다. 답은 " 상속 된 클래스에서 값을 변경할 수 없도록 " 제안했습니다. 상속받은 클래스는 확실히 값을 변경할 수 있습니다. 공개 설정자가있는 공개 속성입니다. 상속 된 클래스가 봉인되었을 때 할 수없는 것은 동작을 재정의합니다. - Adam Robinson
  • 예, 생성자에서 가상 메서드를 호출하는 것은 좋지 않지만 Windows Forms에서 수행하는 작업이 아닙니다.InitiliseComponents? 따라서이 문맥 (정확하게 중첩 된 계층 구조는 아닙니다)에서 나는 그것을 무시할 것입니다. - Aliostad

연결된 질문


관련된 질문

최근 질문