programing

멤버 이니셜 라이저에서 'this'를 사용할 수없는 이유는 무엇입니까?

goodcopy 2021. 1. 15. 19:18
반응형

멤버 이니셜 라이저에서 '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아직 존재하지 않습니다. 기본 생성자가 실행을 마친 후에 만 ​​존재합니다.

17.10.2 인스턴스 변수 이니셜 라이저 :

인스턴스 생성자에 생성자 이니셜 라이저가 없거나 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

반응형