2011-10-04 4 views
1

기본 이니셜 라이저가 설정되어 있고 객체를 만들 때 익명 객체를 정의하면. 기본값이 생략되었거나 이전에 실행 되었습니까? 내가 알고 싶은 이유는 아래의 경우에 실행되면 기본값으로 만들어진 List 객체가 즉시 삭제되어 불필요한 쓰레기를 생성하기 때문입니다. 귀하의 예제 코드에서anonymous는 기본값 재정의를 초기화합니까, 아니면 이후에 실행합니까?

class ArrangedPanel : RectElement 
{ 
    public List<RectElement> arrangedChildren = new List<RectElement>(); 
    public int Padding = 2; 
} 

//Somewhere else 
new ArrangedPanel() 
{ 
    Padding = 5, 
    arrangedChildren = new List<RectElement>() 
    { 
     new ButtonToggle(), 
     new ButtonToggle() 
    } 
} 
+1

클래스 *의 모든 필드 초기화 프로그램과 기본 클래스 *는 생성자 본문이 입력되기 전에 실행됩니다. 일이 일어나는 순서는 다음과 같습니다. 필드 이니셜 라이저는 이니셜 라이저가있는 마지막 기본 클래스가 완료 될 때까지 기본 클래스에 대해 파생 클래스의 텍스트 순서로 실행됩니다. 즉, 파생 된에서 기본 *로 이동합니다. 그런 다음 생성자 본문이 실행되며 기본 생성자부터 시작하여 파생 생성자로 다시 이동합니다. –

답변

2

Padding = 2Padding = 5 전에 발생합니다.

불필요하게 List<RectElement>을 만들었지 만 이러한 불필요한 할당으로 인해 상당한 성능 저하가 발생하는 시나리오를 만들 것을 제안합니다.

+1

그러나 "불필요한"사실은 기본 이니셜 라이저이며 목록과 같은 요소가 null이 아닌 빈 목록을 반환한다는 점을 감안하면 실제로 바람직하고 권장됩니다 (OP가 피의 변수를 노출하는 순간을 무시) ; "불필요한"생성을 제거하면 수동으로 생성하지 않는 다른 API 사용자가 목록 유형에 대해 'null'반환을 처리해야합니다. –

+0

고마워요! 이것이 제가 알고 싶었던 것입니다. 코드를 불필요하게 만들지 않도록 변경할 수 있습니다. 또한 성능이 많이 바뀌지는 않을 것이라는 것을 알았지 만 이러한 시스템을 설계 할 때는 가벼운 배분을 최소화해야한다는 것을 알고 있어야합니다 (예 : XBox360 설계). – jsmars

+0

@ Mr.Disappointment : 나는 varible을 공개하는 것을 드러내지 않으려합니다. 그러나 나는 컬렉션 initializers를 사용하여 객체를 추가 할 수 있기를 원하므로 여기에 묻는 두 번째 문제를 만듭니다. http : // stackoverflow.com/questions/7647097/possible-to-mix-anonymous-element-initializers-and-anonymous-initializers – jsmars

1

arrangedChildren는 당신이 예를 들어

을 만들 마지막 인스턴스로 설정됩니다

arrangedChildren = new List<RectElement>(); 
arrangedChildren = new List<RectElement>() 
    { 
     new ButtonToggle(), 
     new ButtonToggle() 
    } 

arrangedChildren는 두 번째 목록을 가리 킵니다. 다른 객체가 첫 번째 객체를 참조하지 않으면 disapair (GC)됩니다. 그러나 일부 1은 첫 번째 인스턴스에 대한 참조를 유지하면 살아남을 것이며 작업중인 곳에서 중복되거나 두 가지 다른 목록을 가질 수 있습니다.

이 섹션 C# Specification에서 몇 가지 문제를

1

가 발생할 수 17.4.5.2

클래스의 변수 초기화가 에 항목을 즉시 실행 과제의 순서에 해당 인스턴스 필드 해당 클래스의 인스턴스 생성자 (§17.10.2) 중 하나. 변수 초기화 프로그램은 클래스 선언에 나타나는 텍스트 순서로 실행됩니다. 클래스 인스턴스 생성과 초기화 프로세스는 §17.10에서 더 자세히 설명됩니다.

따라서 body 클래스 선언의 초기화가 먼저 수행 된 다음 생성자의 초기화가 수행됩니다. 이것은 일리노이 출력을보고 직접 관찰 할 수 있습니다.