2011-08-04 2 views
0

이 두 객체 생성 문을 설명해주십시오.객체 생성의 차이

+2

이 숙제가 있습니까? – mjv

+0

당신이 생각했던 것을 우리에게 설명해 주면 더 좋았을 것입니다. – Woot4Moo

답변

3

첫 번째 명령은 스택 (A a)에 변수를 할당하고 힙 (new A())에서 초기화합니다.

두 번째 변수는 스택에 변수 만 할당합니다. 초기화되지 않으므로 할당 할 때까지 함수의 반환 값 또는 클래스 생성자를 호출 할 때까지 사용할 수 없습니다.


사이드 참고 : 프로그램을 컴파일하고 실행하는 경우, 심지어 원격으로 당신이 쓴 코드를 닮은하지 않습니다. 변수는 필요한 바로 전에로드됩니다. 위에있는 코드는 대략 다음과 같을 것이다 :

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  8 (0x8) 
    .maxstack 1 
    .locals init ([0] class DERP.Program/A a, // This code here declares a local 
               // variable: A a; 
      [1] class DERP.Program/A b)  // another local variable: A b; 
    nop 
    newobj  instance void DERP.Program/A::.ctor() // This is: new A() 
    stloc.1       // this loads the new A() we created 
            // into A b; (stloc.1 means to store 
            // the last item we created into the 
            // local variable at index [1] 
    ret 
} // end of method Program::Main 

완전히 그 명령을 각각이 무엇인지 이해하지 않으면 괜찮아,하지만 난 그것을 시도하고 만드는 데 댓글을 달았습니다 아마도 앞으로 나아갈 수 있습니다. 우리는 결코 A a을 할당하지 않기 때문에 로컬 스택에 앉아서 놀고 아무것도하지 않습니다. 어떤 객체도 가리 키지 않기 때문에 사용할 수 없습니다.


는 실제 할당에서 분리 선언을 볼 수있는 코드에서 여러 가지 이유가 있습니다.

예를 들어 try {} catch {} 절 외부에서 변수를 선언해야하는 경우가 있습니다. 클래스가 생성자에서 값을 가져옵니다. 당신은 데이터를 데이터베이스에서 가져 오는 함수를 가지고 있습니다. 그러나 DB 호출 이후 예외를 catch하고 throw 된 경우 DB 호출에서 반환 된 값 대신 클래스를 기본값으로 초기화합니다. 방식으로 인해 범위 지정에

C#으로 작동하는 try {} catch {} 내부에 선언 된 변수는 코드에서 변수 이전 선언에 당신이에게 초기화 전에 따라서 당신이 필요로하는 것, 그것은 외부에서 액세스 할 수 없습니다.

+0

귀하의 진술 : "두 번째는 스택에 변수를 할당하기 만하며 초기화되지 않으므로 함수의 반환 값이나 클래스 생성자를 호출 할 때까지는 사용할 수 없습니다." 이제 내 두 번째 객체 A와 함수를 호출하면 그것에 대해 무엇이 있는지 알려주십시오. a.Func(); func가 어떤 것을 반환하지 않는다면 그것을 사용할 수 있습니까? –

+0

알았어. 너의 요지가있어. 고마워. –

+0

아니. 변수'A a'를 선언하면, 뭔가를 할당하는 것 외에는 어떤 식 으로든 사용할 수 없다. 'a.Func()'는 변수가 초기화되지 않았다는 컴파일러 오류를 생성합니다. 'A a = new A()'또는'A a = SomeFunctionThatReturnsClassA()'를 할 필요가 있습니다. –

2

A a = new A();

이 유형 A의 새로운 객체를 생성합니다. a의 값은 A의 새 인스턴스가됩니다.

A a;

이것은 단지 A의 유형으로 선언합니다. a의 값은 null입니다.

0

첫 번째 것은 새로운 insatnce를 만들고 변수 a에 할당합니다.

두 번째 인스턴스는 인스턴스를 만들지 않으므로 anull입니다.

0

제 성명 그 클래스의 새로운 오브젝트 인스턴스를 생성하며 이는 단지 참조를 만드는 번째 문장에서 변수

에 할당한다.

0

첫 번째 구문 만 실제로 새 개체를 만듭니다. 다른 두 번째 구문은 스택에 A 형 변수를 할당한다고 언급했습니다.

처음으로 맨드 힙에 새 오브젝트를 작성하면 스택에 작성된 A 유형의 변수 a에 참조가 저장됩니다.