멤버 이니셜 라이저에서 'this'를 사용할 수없는 이유는 무엇입니까?
중복 가능성 :
멤버 이니셜 라이저에서 'this'를 사용할 수 없습니까?
다음과 같은 작업을 시도하면 오류가 발생하는 이유가 무엇입니까?
public class Bar
{
public Bar(Foo foo)
{
}
}
public class Foo
{
private Bar _bar = new Bar(this);
}
다음과 같은 오류가 발생합니다.
"멤버 이니셜 라이저에서 'this'를 사용할 수 없습니다."
그러나 다음은 작동합니다.
public class Foo
{
private Bar _bar;
public Foo()
{
_bar = new Bar(this);
}
}
아무도 그 이유를 알고 있습니까? 내 이해는 이것들이 동일한 IL로 컴파일된다는 것이므로 하나는 허용되고 다른 하나는 허용되지 않는 이유가 궁금합니다.
고마워, 알렉스
나는 의심 이 전에 개체를 사용할 수 없도록이다 적어도 모든 기본 클래스 멤버가 적절하게 초기화 보장, 기본 클래스 생성자가 실행하고있다. (변수 이니셜 라이저는 기본 클래스 생성자 보다 먼저 실행되는 반면 생성자 본문은 그 후에 실행 됩니다.)
주석이 달린 사양이 다음에 가까워지면 이에 대해 말할 것이 있는지 확인합니다.
편집 : C # 4 주석이 달린 사양에는 설명이 없습니다. 단지 (10.5.5.2에서) :
인스턴스 필드의 변수 이니셜 라이저는 생성중인 인스턴스를 참조 할 수 없습니다.
필드 이니셜 라이저는 기본 클래스 생성자보다 먼저 실행되므로 this
아직 존재하지 않습니다. 기본 생성자가 실행을 마친 후에 만 존재합니다.
인스턴스 생성자에 생성자 이니셜 라이저가 없거나 base (...) 형식의 생성자 이니셜 라이저가있는 경우 해당 생성자는 해당 클래스에 선언 된 인스턴스 필드의 변수 이니셜 라이저가 지정한 초기화를 암시 적으로 수행합니다. 이는 생성자에 대한 입력 즉시 및 직접 기본 클래스 생성자의 암시 적 호출 전에 실행되는 일련의 할당에 해당합니다. 변수 이니셜 라이저는 클래스 선언에 나타나는 텍스트 순서로 실행됩니다.
다음 코드가 실행될 때 클래스가 초기화되기 전에 필드가 초기화되기 때문이라고 생각합니다.
private Bar _bar = new Bar(this);
"this"는 참조 할 실제 값이 없습니다.
생성자에 넣는 것은 "this"로 참조 할 수있는 "Foo"인스턴스가 있음을 의미합니다.
멤버 이니셜 라이저는 클래스 생성자보다 먼저 실행됩니다. 단일 클래스에 많은 멤버 이니셜 라이저가있을 수 있습니다.
생성자에서 'this'를 사용하면 이니셜 라이저가있는 모든 멤버가 초기화됩니다. 그래서 모든 것이 괜찮습니다.
멤버 이니셜 라이저에서 'this'를 사용하는 경우 : 다른 멤버 (이니셜 라이저가 부착 된)가 아직 초기화되지 않았을 수 있습니다.-> 'this'가 아직 준비되지 않았습니다. 그래서 여기서 'this'를 사용할 수 없습니다.
C #에서 논리는 메서드 및 속성 본문 외부에 포함되지 않습니다.
필드 이니셜 라이저는 예외이지만 몇 가지 제한이 있습니다.
그것은으로 현재 객체의 참조지고 잘못된 거라고 이 동안 클래스 필드 선언, 로직하지만 클래스 디자인이 아니기 때문에 키워드를 이 런타임 의미의 일부입니다.
그건 그렇고, C # 디자인 결정 인 것 같습니다
. 사실 필드 이니셜 라이저가 클래스 생성 중에 실행되므로 "클래스 선언의 현재 인스턴스"를
이 . 그러나 다시 말하지만 이것은 메서드 또는 속성 본문 범위 밖에있는 것은 무엇
입니까?
존 소총과 다른 사람들이 지적했듯이, 이 필드 이니셜 라이저가 기본 생성자 실행 후 실행되기 때문에 사용할 수 없습니다.
참조 URL : https://stackoverflow.com/questions/6125247/why-cant-you-use-this-in-member-initializers
'programing' 카테고리의 다른 글
트랜잭션 내에서 테이블 자르기 (0) | 2021.01.15 |
---|---|
malloc 구현은 해제 된 메모리를 시스템에 반환합니까? (0) | 2021.01.15 |
neo4j의 노드 식별자 (0) | 2021.01.15 |
android-콘텐츠 제공자가없는 CursorLoader 및 SQLite (0) | 2021.01.15 |
네임 스페이스 종속성이 필요하지 않습니다. (0) | 2021.01.15 |