2011-10-18 1 views
0

C#에서 ref 키워드를 사용하여 대리자 함수에 전달 된 클래스 변수를 수정하려고합니다. 델리게이트 함수가 부모와 두 자식에 대한 컨테이너에 저장된 값을 수정할 수있게하려고합니다. 지금 당장 일어날 일은 먼저 부모 클래스 (parent [parent])에 대한 참조를 전달했기 때문에 부모를 수정할 수 있지만 먼저 자식을 처리해야하므로 leftChild 및 rightChild에 대한 참조를 전달해야하므로 대리자 함수가 자식을 수정할 수 있습니다. C#에서 ref를 사용하여이 클래스 변수를 수정하려면 어떻게해야합니까?

  • 는 델리게이트 함수가 컨테이너에 저장된 값을 수정할 수 있도록, 용기 [leftChildIndex]에 대한 참조 leftChild 것이 가능하다?

    T leftChild = default(T); 
    T rightChild = default(T); 
    

    당신은 그 객체에 대한 참조를 전달하고, 그들이 바로 방법이 끝난 후 파괴 얻을 : 당신이 그들을 정의하는 경우 (오른쪽 아이 같은)

    private void traversePostOrder(Modify operation, int parentIndex) { 
        if (parentIndex < size) { 
         int leftChildIndex = getLeftChildIndex(parentIndex); 
         int rightChildIndex = getRightChildIndex(parentIndex); 
         T parent = container[parentIndex]; 
         T leftChild = default(T); 
         T rightChild = default(T); 
    
         Library.Diagnostics.Message.logMessage("P: " + parent, 2); 
    
         if (leftChildIndex < container.Length) { 
          traversePostOrder(operation, leftChildIndex); 
          leftChild = container[leftChildIndex]; 
         } 
    
         if (rightChildIndex < container.Length) { 
          traversePostOrder(operation, rightChildIndex); 
          rightChild = container[rightChildIndex]; 
         } 
    
         operation(ref container[parentIndex], ref leftChild, ref rightChild); 
        } 
    } 
    

답변

1

문제는 왜냐하면 그들은 지역 변수이기 때문입니다.
개체를 직접 보내보십시오.

private void traversePostOrder(Modify operation, int parentIndex) { 
    if (parentIndex < size) { 
     int leftChildIndex = getLeftChildIndex(parentIndex); 
     int rightChildIndex = getRightChildIndex(parentIndex); 
     T parent = container[parentIndex]; 
     bool leftChildModified = false; 
     bool rightChildModified = false; 

     Library.Diagnostics.Message.logMessage("P: " + parent, 2); 

     if (leftChildIndex < container.Length) { 
      traversePostOrder(operation, leftChildIndex); 
      leftChildModified = true; 
     } 

     if (rightChildIndex < container.Length) { 
      traversePostOrder(operation, rightChildIndex); 
      rightChildModified = true; 
     } 

     if(leftChildModified && rightChildModified) 
     { 
      operation(ref container[parentIndex], ref container[leftChildIndex], ref container[rightChildIndex]); 
     } 
     else if(leftChildModified) 
     { 
      operation(ref container[parentIndex], ref container[leftChildIndex], ref Default(T)); 
     } 
     else if(rightChildModified) 
     { 
      operation(ref container[parentIndex], ref Default(T), ref container[rightChildIndex]); 
     } 
     else 
     { 
      operation(ref container[parentIndex], ref default(T), ref default(T)); 
     } 
    } 
} 
+0

불행하게도, 오류가 발생 내가'심판 leftChildModified을하려고 할 때? 컨테이너 [leftChildIndex] : 기본 (T)'이고 오른쪽 자식에 대해 동일합니다. ref는 할당 가능한 변수 여야합니다. – jtfairbank

+0

3 자에 대해 잘 모름); 편집 된 답변보기. –

+0

하하, 더 많은 (구문) 오류가 발생합니다. 나는 네가하는 말을 보았다. 도와 주셔서 감사합니다! 삼항 연산자를 변수에 할당 한 다음 변수를 사용할 수 있습니까? 아니면 원래의 문제를 재현하겠습니까? – jtfairbank

1

당신이 찾고있는 것은 포인터이고 C#은 운좋게도 노출되지 않습니다.

당신은 단순히 다시 클래스 변수에 값을 할당 할 수 있습니다

operation(ref container[parentIndex], ref leftChild, ref rightChild); 
container[leftChildIndex] = leftChild; 
container[rightChildIndex] = rightChild;