2013-04-05 2 views
2

C#의 선언은 만들 변수에 메모리를 할당합니까 아니면 메모리를 할당하고 메모리에 할당 된 변수를 초기화하기 위해 생성자를 호출 할 수있는 새 연산자입니까?C#의 선언이 메모리를 할당합니까 아니면 메모리를 할당하는 새로운 연산자입니까?

제 생각에 새 연산자가 없으면 모든 유형의 생성자를 호출 할 수 없습니다. 나 맞아? 사양하지 않고

+1

약간의 수정, ** 생성자 ** – Charleh

+1

Eric Lippert의 대답은 [here] (http://stackoverflow.com/questions/15520378/memory-allocation-of-class-objects)입니다. 질문이 정확한 복제물이 아니기 때문에 질문하는 것보다 자세하게 들어갑니다. –

+0

Eric의 게시물을 +10 할 수 있으면 좋겠다. 그것은 아주 계몽 적입니다. – code4life

답변

1

선언은 새로운 키워드로 객체를 생성 할 때까지 참조 유형의

string x; 
// x = null in memory 

string x = ""; 
// x = string in memory with value. 

MyObjectType x; 
// x = null; 

MyObjectType x = new MyObjectType(); 
// x = MyObjectType in memory. 
+0

그래서 감속은 메모리를 할당하고 new 연산자는 생성자를 호출하는 데 사용됩니다. 맞습니까? 왜냐하면 구조체와 열거 형은 인스턴스 생성에 생성자 호출이 필요하지 않지만 참조 형은 호출하는 것을 알고 있기 때문입니다. 그래서 제가 정말로 묻고있는 질문은 메모리가 어느 지점에 할당되어 있는지입니다. 감속이 끝나거나 새로운 연산자가 컴파일러에 의해 "처리"되는 시점에 있고 생성자가 할당 된 메모리를 데이터로 채우도록 호출됩니다. –

+0

대답은 둘 다 ... 선언은 NULL 인스턴스가있는 참조 형식 메모리를 만들고 인스턴스화는 전체 개체 메모리를 만듭니다. – MaxOvrdrv

0

선언은 참조 용으로 만 공간을 차지 ... C#에서 (객체) 널 (null)에 대한 메모리를 할당합니다.

string s; // only reference type memory, which is based on the machine architecture. 

당신이있는 경우 :

string s = "some string"; // reference (pointer) + memory allocated on the heap. 

그것은하지만, 거의 값 유형에 대해 동일합니다, 자신의 메모리가 할당 된 인라인 같은 당신이있는 경우

때문에 값 유형입니다 여기서 값 유형이 선언됩니다.

당신이 맞습니다. 유형의 객체가 인스턴스화되거나 생성되지 않는 한 어떠한 유형의 생성자도 호출 할 수 없습니다.

19

C#의 선언은 생성 할 변수에 메모리를 할당합니까? 아니면 메모리를 할당하고 메모리에 할당 된 변수를 초기화하기 위해 강사를 호출 할 수있는 새 연산자입니까?

먼저 질문하시는 질문을하고 있는지 확인하십시오. 값 유형의 경우 변수 저장 위치 및 값 저장 위치는 이고 저장 영 역은입니다. 참조 유형의 경우 변수와 연관된 저장 위치는 객체과 연관된 저장 위치에 대한 참조을 포함합니다. 그것들은 완전히 다릅니다.

두 번째로, "변수"의 "선언"이 의미하는 바를 명확히 해봅시다. 정적 필드, 인스턴스 필드, 로컬 변수 및 형식 매개 변수에는 모두 선언이 있습니다. 또한 지역 변수와 형식 매개 변수의 할당 의미는 람다의 외부 지역 폐쇄 인 경우 다르며 로컬이 비동기 메소드 또는 반복기 블록에있을 때 의미가 달라집니다.

그럼 당신이 참조 형의 로컬 변수가 로컬에 대한 공상 아무것도 없다는 것을 가정하자 :

void M() { 
    Animal x = new Giraffe(); ... 

로컬 변수 x의 저장 위치는 단기 저장 오프 할당이 - - 일반적으로 M() 메소드가 활성화 될 때 스택 또는 레지스터.

"new Giraffe()"가 평가 될 때 런타임은 장기 저장소 (GC 힙)에서 기린을위한 메모리를 할당 한 다음 해당 객체에 대한 참조를 생성자에 전달합니다. 생성자가 반환하면 참조가 로컬에 할당됩니다.

따라서 두 개의 저장 위치에이 있습니다.x의 단기적인 위치는 메소드의 활성화 동안 만 지속되며, 가비지 컬렉터가이를 정리할 때까지 참조되는 것에 대한 장기 저장 공간이 있습니다.

질문에 답변이되지 않는 경우 질문을 명확히하십시오.

새 연산자없이 생성자를 호출 할 수 있습니까?

나는 "생성자"에 의해 인스턴스 생성자와 정적 생성자가 아니라고 가정합니다.

"정상적인"의미는 없습니다.

관련 문제