방법

2017-10-03 17 views
0

내부 클래스를 인스턴스화하면이방법

void Instantiate(Class c) { 
    c = new Class(); 
} 

Class c1 = null; 
Instantiate(c1); 
c1.property .....gives me null reference exception 

클래스가 메소드 내에서 인스턴스화 할 수 있으며 외부에서 사용을 할 수 있습니까?

+0

참조로 'c1'을 전달해야합니다. – MarcinJuraszek

+0

@MarcinJuraszek, 답장을 보내 주셔서 감사합니다,하지만 레퍼런스 타입은 메소드에 전달할 때 참조가 전달되지 않습니까? 오, 그것은 그것의 인스턴스가 메소드에 전달되기 전에 만 발생합니까? –

+0

내 대답을 설명으로 업데이트했습니다. C#에서는 모든 매개 변수가 기본적으로 값으로 전달됩니다. 참조 유형의 경우 값은 객체의 참조 (주소)입니다. 그러나 참조가 복사되므로 메서드 내에서 수정하면 메서드 외부에 반영되지 않습니다. 이 일을하기 위해서'ref '를 써야합니다. – MarcinJuraszek

답변

0

예,하지만 당신은 참조로 인수를 전달해야 :

void Instantiate(ref Class c) { 
    c = new Class(); 
} 

Class c1 = null; 
Instantiate(ref c1); 

모든 매개 변수는 기본적으로 값으로 전달됩니다. 참조 유형의 경우 참조는 전달되는 값입니다. 따라서 객체의 내부 상태를 변경하면 메소드 밖에서 볼 수 있습니다 (예 : 요소를 목록에 추가). 하지만 전체 인스턴스를 바꿀 수는 없습니다. 변경 사항은 호출자에게 표시되지 않습니다.

의 당신이 List<T> 있다고 가정 해 봅시다 :

var myList = new List<T>(); 

이의이 일부 메모리 위치 0x1234에서 초기화있어 가정하자. 지금 당신은 List<T>을 취하는 방법에 전달 :

void doSomethingWithAList(List<T> list) 
{ 
} 

그리고 나중에

doSomethingWithAList(myList); 

을이 시점에서 방법의 myList 외부 listdoSomethingWithAList 내부 점을 모두 같은 요지 (0x1234)에서. list.Add(default(T))을 수행 한 후 myList.Lenghth으로 전화하면 0x1234의 동일한 개체를 모두 가리키고 있기 때문에 1을 반환합니다.

그러나, doSomethingWithAList 안에 당신은 list에 새 목록을 할당합니다

void doSomethingWithAList(List<T> list) 
{ 
    list = new List<T>(); 
} 

list 점을 그 새로운 객체에. myList은 여전히 ​​0x1234을 가리 킵니다.

을 참조하여 업데이트하면 list 포인트도 업데이트됩니다. myList은 메서드 외부를 가리 킵니다.

+0

이해해 주셔서 다시 한번 감사드립니다. –

0

나는 모든 매개 변수가 다른 방법으로 값에 의해 전달된다는 혼란이 있다고 생각한다. 따라서 참조 유형을 메소드에 전달하면 참조 사본이 메소드에 전달됩니다.

예에서 c1은 처음에 null을 가리 킵니다. instantiate를 호출 할 때 c1의 복사본을 호출 할 때 c1_이 만들어지며 (null을 가리킴) c1_는 c1이 아닌 Instantiate 메서드로 전달됩니다.

코드를 작동시키는 데는 두 가지 방법이 있습니다. 첫 번째 방법은 ref 키워드를 사용하는 것입니다. ref 키워드를 사용하면 c1을 메소드에 전달할 수 있습니다.

void Instantiate(ref Class c) { 
    c = new Class(); 
} 

Instantiate(ref c1); 

난 당신이 특정 예에서 반환 유형을 사용하는 것이 좋습니다 것으로 호출합니다.

Class Instantiate() { 
    return new Class(); 
} 

다음과 같은 방법으로 사용할 수 있습니다.

Class c1 = Instantiate(); 
+0

설명을 주셔서 감사합니다 @ 폴, 더 의미가! –