내부 클래스를 인스턴스화하면이방법
void Instantiate(Class c) {
c = new Class();
}
Class c1 = null;
Instantiate(c1);
c1.property .....gives me null reference exception
클래스가 메소드 내에서 인스턴스화 할 수 있으며 외부에서 사용을 할 수 있습니까?
내부 클래스를 인스턴스화하면이방법
void Instantiate(Class c) {
c = new Class();
}
Class c1 = null;
Instantiate(c1);
c1.property .....gives me null reference exception
클래스가 메소드 내에서 인스턴스화 할 수 있으며 외부에서 사용을 할 수 있습니까?
예,하지만 당신은 참조로 인수를 전달해야 :
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
외부 list
doSomethingWithAList
내부 점을 모두 같은 요지 (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
은 메서드 외부를 가리 킵니다.
이해해 주셔서 다시 한번 감사드립니다. –
나는 모든 매개 변수가 다른 방법으로 값에 의해 전달된다는 혼란이 있다고 생각한다. 따라서 참조 유형을 메소드에 전달하면 참조 사본이 메소드에 전달됩니다.
예에서 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();
설명을 주셔서 감사합니다 @ 폴, 더 의미가! –
참조로 'c1'을 전달해야합니다. – MarcinJuraszek
@MarcinJuraszek, 답장을 보내 주셔서 감사합니다,하지만 레퍼런스 타입은 메소드에 전달할 때 참조가 전달되지 않습니까? 오, 그것은 그것의 인스턴스가 메소드에 전달되기 전에 만 발생합니까? –
내 대답을 설명으로 업데이트했습니다. C#에서는 모든 매개 변수가 기본적으로 값으로 전달됩니다. 참조 유형의 경우 값은 객체의 참조 (주소)입니다. 그러나 참조가 복사되므로 메서드 내에서 수정하면 메서드 외부에 반영되지 않습니다. 이 일을하기 위해서'ref '를 써야합니다. – MarcinJuraszek