문제

이 질문은 이미 여기에 답이 있습니다.

나는 다음과 같은 수업을 작성하는 데 익숙합니다.

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

막대를 자동 프로파일로 변환하는 것은 편리하고 간결한 것처럼 보이지만 생성자를 추가하고 초기화를 거기에 넣지 않고 초기화를 어떻게 유지할 수 있습니까?

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

당신은 생성자를 추가하는 것이 자동 비판에서 얻을 수있는 노력 절약에 인라인이 아니라는 것을 알 수 있습니다.

이와 같은 것이 나에게 더 의미가 있습니다.

public string Bar { get; set; } = "bar";
도움이 되었습니까?

해결책

업데이트 - 아래의 답변은 C# 6이 시작되기 전에 작성되었습니다. C# 6에서는 다음을 쓸 수 있습니다.

public class Foo
{
    public string Bar { get; set; } = "bar";
}

당신은 할 수 있습니다 또한 작성자에만 쓸 수있는 읽기 전용 자동 구현 속성을 작성하십시오 (기본 초기 값도 제공 할 수 있습니다.

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

불행히도 지금 당장이 일을 할 방법이 없다는 것은 불행한 일입니다. 생성자의 값을 설정해야합니다. (생성자 체인을 사용하면 복제를 피하는 데 도움이 될 수 있습니다.)

자동으로 구현 된 속성은 현재 편리하지만 확실히 더 좋을 수 있습니다. 이런 종류의 초기화를 자주 읽기 전용 자동 구현 된 속성만큼 자주 제작자에 설정할 수 있고 읽기 전용 필드로 뒷받침됩니다.

이것은 C# 5까지는 발생하지 않았지만 C# 6을 위해 계획되고 있습니다. 선언 시점에서 초기화를 허용하는 측면에서. 그리고 읽기 전용으로 자동 구현 된 속성을 생성자 본문에서 초기화 할 수 있습니다.

다른 팁

수업의 생성자를 통해 할 수 있습니다.

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

다른 생성자 (즉, 매개 변수를 취하는 다른 생성자) 또는 많은 생성자가있는 경우 항상이를 가질 수 있습니다 (생성자 체인이라고 함).

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

항상 기본 생성자로 호출을 체인하면 모든 기본 속성 초기화를 설정할 수 있습니다. 사슬이 발생할 때, 사슬 생성자는 호출 생성자 전에 호출되어보다 전문화 된 생성자가 해당되는 경우 다른 기본값을 설정할 수있게됩니다.

C# 6.0에서 가능할 것입니다.

public int Y { get; } = 2;

기본 생성자 (및 물론 너무없는 경우에는 비 디폴트 생성자)에서 :

public foo() {
    Bar = "bar";
}

이것은 내가 믿는 원래 코드를 성능이 없다는 것이 아닙니다. 왜냐하면 이것은 어쨌든 무대 뒤에서 일어나기 때문입니다.

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