2013-08-29 1 views
3

개체를 선언하지만 개체를 ​​초기화하지 않는 클래스가 있습니다. 그런 다음 개체를 다른 클래스의 메서드에 전달하여 초기화합니다. 예상되는 것은 호출하는 클래스의 객체가 이제 초기화 된 객체에 대한 참조를 가지지 만 대신 null입니다. 난 아직도 널 (null)로 가리키는 InitializeObjectA()를 호출 한 후 foo는 사용하려고하면다른 클래스의 메서드에서 초기화 된 개체는 C#의 메서드를 호출하여 참조되지 않습니다.

class MainClass 
{ 
    ObjectA foo; 

    OtherClass.InitializeObjectA(foo); 

    // why is foo null over here? 
} 

class OtherClass 
{ 
    public static void InitializeObjectA(ObjectA device) 
    { 
     device = new ObjectA(); 
    } 
} 

내 문제가 장치 :

여기에 무슨 뜻인지의 예입니다! InitializeObjectA()out ObjectA device으로 변경하면 작동합니다. 아무도 이것이 왜 필요한지 설명 할 수 있습니까? 당신이

device = new ObjectA(); 

을 할 때 메모리에 다른 참조하여, 새에 개체를 설정하고 있기 때문이다

+1

참조 또는 값으로 전달하는 MSDN : http://msdn.microsoft.com/en-us/library/s6938f28.aspx. – Vladimir

+0

값을 통한 전달과 참조를 통한 전달을 잘 이해하면 실제로 도움이됩니다! http://msdn.microsoft.com/en-us/library/0f66670z.aspx –

+0

foo가 아직 인스턴스화되지 않았기 때문에 패스에 대한 참조가 없으므로 메소드가 새 참조를 다시 전달할 방법이 없습니다. – Rake36

답변

5

, 당신은 참조로 전달해야

이없이
public static void InitializeObjectA(out ObjectA device) 
{ 

InitializeObjectAnew ObjectA()device 매개 변수를 설정,하지만하지 않습니다 기본적으로 참조가 값으로 전달되므로 호출자에게 영향을줍니다. 방금 무효 대신 인스턴스를 반환 초기화하려는 경우 것은 종종이 처리하는 더 좋은 방법입니다,

참고 :

public static ObjectA InitializeObjectA() 
{ 
    return new ObjectA(); 
} 

ref 또는 out 통과를 사용할 필요를 피할 수 있습니다.

+1

또는 간단히 ObjectA를 반환하십시오. –

+0

@JustinPihony 좋은 지적입니다. –

+0

감사합니다. 모든 객체가 참조로 전달 되기는했지만 내 혼란이 있다고 생각합니다. – w1res

1

.

class MainClass 
{ 
    ObjectA foo = OtherClass.InitializeObjectA(foo); 
} 

class OtherClass 
{ 
    public static ObjectA InitializeObjectA(ObjectA device) 
    { 
     return = new ObjectA(); 
    } 
} 

또는 대신

class MainClass 
{ 
    ObjectA foo = null; 
    OtherClass.InitializeObjectA(out foo); 
} 

class OtherClass 
{ 
    public static void InitializeObjectA(out ObjectA device) 
    { 
     device = new ObjectA(); 
    } 
} 

here을 찾을 수 있습니다 발생하는 이유에 대한 더 많은 정보 :

당신은 뭔가를해야한다.

1

클래스가 참조 유형 인 경우 매개 변수 (복사본)로 foo의 주소를 전달하면 사본을 변경할 수 있지만 새 주소는 원래 foo로 다시 설정되지 않습니다. 이 작업은 ( 또는 참조 키워드 만) 수행됩니다.

public static void InitializeObjectA(ref ObjectA device) 
{ 

또는 : :이 작업 할 경우

+0

foo가 보내지기 전에 foo가 인스턴스화 되었다면, foo에 관한 내용을 변경하는 것이 좋습니다. 이 경우 시작에 대한 참조가 없으므로 통과에 대한 참조가 없습니다. – Rake36

+0

@ Rake36, foo가 인스턴스를 가지고있을 때조차도 메소드가 호출되기 전에 원래 인스턴스 포인터가 스택에 푸시되고 호출 후에 다시 팝백됩니다. 따라서 포인터를 변경하면 원래 포인터가 참조됩니다. _ref_ 또는 _out_없이 매개 변수의 인스턴스를 변경할 수 없습니다. –

+0

값 유형 인 경우 true이고, ObjectA의 속성을 변경하는 경우 이는 허용됩니다. 그게 내가하려는 것 뿐이야. 여기서 '변화'라는 단어는 오해의 소지가 있습니다. – Rake36

1

ObjectA foo라는 인스턴스를 생성하는 가장 간단한 방법은 바로 초기화 방법은 생성 된 개체를 반환하지 왜 변수

class MainClass 
{ 
    ObjectA foo = OtherClass.InitializeObjectA(); 
} 

class OtherClass 
{ 
    public static ObjectA InitializeObjectA() 
    { 
     return new ObjectA(); 
    } 
} 
+0

초마다 나를 이길 :) – Joel

1

에 할당 할 인스턴스를 반환하는 것입니다?

class MainClass 
{ 
    var foo = OtherClass.InitializeObjectA(foo); 
} 

class OtherClass 
{ 
    public static ObjectA InitializeObjectA(ObjectA device) 
    { 
     return new ObjectA(); 
    } 
} 
+0

나는이 질문에 언급하지 않았지만 실제 코드에서는 이미 bool을 반환하고있다. – w1res

+0

메서드의 주된 책임은 개체를 만들고 초기화하는 것입니다. 왜 반환하지 않습니까? 참조 또는 Out 매개 변수를 사용하여이 메서드를 실행하면 부작용이 발생합니다 (http://stackoverflow.com/questions/810289/when-exactly-does-a-method-have-side-effects). 부작용으로 인해 디버깅 및 유지 관리가 더 어려워 지므로 피해야합니다. –

1

내가 알기로, C# 컴파일러는 실제로 그런 식으로 변수를 초기화하지 않습니다.초기화되지 않은 매개 변수를 함수에 전달하는 것은 오류이므로 Visual Studio 2010에서이 코드를 컴파일 할 수도 없습니다.

당신이 원하는 : 그것은 자바에서와 마찬가지로

난 당신이 어쨌든 뭘 하려는지 생각입니다
ObjectA foo = null; 

는 C#을 당신을 위해 그것을하지 않습니다. 이것은 아직도 내가 당신이를 통과 할 경우, 당신은 참조로 패스를 사용할 수 있습니다

ObjectA foo = InitializeObjectA() 

public static ObjectA InitializeObjectA(){ 
    return new ObjectA(); 
} 

대안처럼 뭔가 코드를 리팩토링에 의해 아마 최고의 수행이다, 그러나 달성하기 위해 노력하고 생각하는 행동을하지 않습니다 참조 (또는 익숙한 경우 포인터)를 함수에 추가하면 해당 참조에 대한 변경 사항이 함수 범위 밖에 반영됩니다.

+0

또는 : _ObjectA foo = new ObjectA(); _ –

+0

예. 나는 그저 어떤 이유로 든 InitializeObject 메서드를 사용하기를 원한다고 생각했다. – UpQuark