C# 자동 비판 초기화 [중복
-
05-07-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
나는 다음과 같은 수업을 작성하는 데 익숙합니다.
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";
}
이것은 내가 믿는 원래 코드를 성능이 없다는 것이 아닙니다. 왜냐하면 이것은 어쨌든 무대 뒤에서 일어나기 때문입니다.