2014-10-25 4 views
3

개체를 일부 기본값으로 '다시 설정하는 중'문제가 있습니다.작동하지 않는 개체를 다시 초기화하십시오.

그래서 저는 MPoint 타입의 포인트 (내 클래스)라는 객체를 가지고 있습니다. 포인트가 일정 시간 이상 사용되면 포인트를 다시 기본값으로 재설정하고 싶습니다. 그래서 아래에 나와있는 CheckPointExpired라는 메서드를 만들었습니다.

문제는 메서드가 호출되고 PointUsedPoint 속성이 MaxResuse보다 큰 경우 point 객체를 null로 놓고 새 점을 만듭니다. 그러나 RunPoint 메서드에서 내 코드를 다시 디버깅 할 때 점 개체가 값을 변경하지 않았 음을 알 수 있습니다. 왜 그런지 모르겠다 고요?

PointPoint 객체를 CheckPointExpired 메서드에 전달하면 참조로 전달되므로 객체에 대한 변경 사항이 RunPoint 메소드에 반영되어야합니다. 분명히 나는 ​​뭔가를 이해하지 못하고있다.

public MPoint RunPoint(MPoint point) 
    { 
     // first check if point has expired 
     CheckPointExpired(point) 

     // rest of my code 
    } 

    void CheckPointExpired(MPoint point) 
    { 
    if (point.PointUsed >= point.MaxResuse) 
    { 
     int lvl = point.Level; 
     int maxLB = point.MaxLookBack; 
     int maxReuse = point.MaxResuse; 
     int order = point.Order;    

     point = null; 
     point = new MPoint(maxReuse, maxLB, lvl, order); 
    } 
    } 

답변

4

당신은 ref 키워드를 사용하여 참조로 포인트를 전달해야

void CheckPointExpired(ref MPoint point) 
{ 
    if (point.PointUsed >= point.MaxResuse) 
    { 
     int lvl = point.Level; 
     int maxLB = point.MaxLookBack; 
     int maxReuse = point.MaxResuse; 
     int order = point.Order;    

     point = null; 
     point = new MPoint(maxReuse, maxLB, lvl, order); 
    } 
} 

CheckPointExpired(ref point); 

그렇지 않으면 당신은 단지 필드 또는 지점의 속성을 변경할 수 있습니다 그들은 원래의 객체를 볼 수 있습니다를하지만의 할당은이 전달 된 인수의 참조를 변경하지 않습니다. 클래스가 참조 유형인데도 ref 매개 변수를 사용하지 않으면 실제로 참조의 사본을 가져옵니다. 예 :

string foo = "Foo"; 
string bar = foo; 

다음은 그냥 오래된 참조를 멀리 던져 영향을주지 않는 다른 값을 가진 줄을 초기화 같은 location.Whenever 포인트 bar.So에 할당 bar = foo 복사 foo에의 참조 두 가지 참조가 foo :

bar = "bar"; 
+0

나는 본다. 나는 당신이 객체를 통과 할 때 그것이 디폴트로 참조로 전달 된 줄 알았습니까? 그래서 객체는 실제로 전달 될 때 복사됩니까? – mHelpMe

+1

@mHelpMe 개체의 참조가 개체 자체가 복사되지 않습니다. –

1

값을 변경하려면 기능에 대한 참조를 잊어 버렸습니다. 값으로/전달 전용으로 전달하고 있습니다. ref 키워드는 참조 용이며, 해당 주소로 개체를 전달하는 것을 의미합니다.이 개체를 사용하여 함수 내에서 개체를 편집하거나 변경할 수 있습니다.

void CheckPointExpired(ref MPoint point) 
    { 
    if (point.PointUsed >= point.MaxResuse) 
    { 
     int lvl = point.Level; 
     int maxLB = point.MaxLookBack; 
     int maxReuse = point.MaxResuse; 
     int order = point.Order;    

     point = null; 
     point = new MPoint(maxReuse, maxLB, lvl, order); 
    } 
    } 

주소를 전달해야합니다. 그렇지 않으면 함수가 개체에서 주소를 읽을 수 없습니다.

public MPoint RunPoint(MPoint point) 
    { 
     // first check if point has expired 
     CheckPointExpired(ref point) 

     // rest of my code 
    } 
관련 문제