2014-05-20 3 views
0

B 객체 유형에 대한 참조를 보유하고 있지만 이번에는 null로 초기화되는 객체 A가 있다고 가정합니다.함수에서 참조 유형 매개 변수 전달 및 업데이트

A->B(== null) 

나는 C.
(B->C)를 입력 참조를 보관 유지 타입 B의 객체에 널을 대체합니다.
그래서 나는 A->B->C을 얻을 것이다.

B 객체의 참조를 제공하여 링크 할 수없는 이유는 무엇입니까? (null을 포함하지만 장면의 특수한 메모리 주소에 연결되어 있고 null이 아닌 C 객체를 할당하면 이후에 A -> B-> C

가 왜이 조작을 수행 할 수있는 위해는 A 객체 전달해야합니다이 질문을 이해하려고 노력을 요구한다

왜 다음과 같은 코드 : A와 새로운 노드의 삽입? 특정 노드의 하위 노드가 작동하지 않습니다. 코드는 다음과 같습니다.

public void InsertNodeToTreeLDR(TreeNode newNode) 
     { 
      var currRoot = Root; 
      InsertNodeToTreeHelper(ref currRoot, newNode);   
     } 

     private void InsertNodeToTreeHelper(ref TreeNode currTreeRoot, TreeNode newNode) 
     { 
      if (currTreeRoot == null) 
      { 
       currTreeRoot = newNode; 
       return; 
      } 

      else if (newNode.Data.CompareTo(currTreeRoot.Data) >= 0) 
      { 
       var currRootLeftChild = currTreeRoot.Leftchild; 
       InsertNodeToTreeHelper(ref currRootLeftChild, newNode); 
      } 

      else 
      { 
       var currRootRightChild = currTreeRoot.RightChild; 
       InsertNodeToTreeHelper(ref currRootRightChild, newNode); 
      } 

     } 

참고 :
이 코드는 모든 코드를 포함하지 않으므로이 함수는 TreeNode 유형의 루트를 보유하는 Tree Class의 일부입니다.
데이터가 == 2 (int) 인 루트가있는 트리가 있고 데이터 == 1로 새 왼쪽 자식을 추가하려고한다고 생각하십시오.
구현시 노드와 하위 사이의 링크가 작동하지 않습니다.

var currRootLeftChild = currTreeRoot.Leftchild; 
InsertNodeToTreeHelper(ref currRootLeftChild, newNode); 

가 ... 위의 코드에서, currRootLeftChild 로컬 변수 :

+0

"null을 포함하지만 아마도 특정 메모리 주소와 연결되어 있습니다."유효한 메모리 주소에 어떻게 연결할 수 있습니까? –

+0

B 타입의 셀을 주소 지정하는 "포인터"와 같은 B에 대한 보류 참조이며 그 안에 null이 있습니다. 어떻게 보입니까? – JavaSa

+0

목표가 불분명합니다. 모호한 포인터 대신 실제 C# 코드를 사용하여 수행 할 작업의 예를 게시 할 수 있습니까? –

답변

2

참조로 전달되는 내용과 C#에서 참조 형식과 상호 작용하는 방법에 대해 혼동스러워합니다. 이 코드는 아무 작업도 수행하지 않습니다.

public void InsertNodeToTreeLDR(TreeNode newNode) 
{ 
    var currRoot = Root; 
    InsertNodeToTreeHelper(ref currRoot, newNode);   
} 

아무 이유도 없는지 확인하려면 한 번에 한 줄씩 살펴 보겠습니다.

var currRoot = Root; 

이 줄은 Root에 의해 참조 것 같은 TreeNode을 참조하라고 currRoot라는 변수를 정의합니다. 따라서 이제 currRootRoot과 동일한TreeNode 인스턴스를 나타냅니다.

InsertNodeToTreeHelper(ref currRoot, newNode); 

는 여기에서 우리는 참조로 변수currRoot를 전달하고 있습니다. 즉, InsertNodeToTreeHelper 메서드는 currRoot 값을 수정할 수 있습니다.그러나 currRoot의 값은 참조에서 TreeNode까지이므로 currRoot의 값이 수정되면 특정 변수가 다른 곳을 가리키고 있다고 말하면서 Root의 값을 처리하지 않습니다. 또한 일부 TreeNode 인스턴스에 대한 참조입니다.

public void ClearTree() 
{ 
    var currRoot = Root; 
    // ClearTreeHelper  
    currRoot = null; 
} 

희망이 그것을 만드는 :

public void ClearTree() 
{ 
    var currRoot = Root; 
    ClearTreeHelper(ref currRoot);   
} 

private void ClearTreeHelper(ref TreeNode currTreeRoot) 
{ 
    currTreeRoot = null; 
} 

이 코드 예제는 정말 그냥이 글을 쓰는 것과 동일 : 그 명확하지 않으면

은, 내가 간단한 예제를 통해이를 설명하려고하자 참조에 의한 패스가 아무 것도하지 않는 이유를 분명히하십시오.

지금, 당신의 실제 문제에 대한, 내가 추측 할 수있는 최선으로, 당신이 실제로 원하는 것은이 같은 것입니다 :

public void InsertNodeToTreeLDR(TreeNode newNode) 
{ 
    if(Root == null) 
    { 
     Root = newNode; 
     return; 
    } 

    InsertNodeToTreeHelper(Root, newNode);   
} 

private void InsertNodeToTreeHelper(TreeNode root, TreeNode newNode) 
{ 
    if (newNode.Data.CompareTo(root.Data) >= 0) 
    { 
     if(root.LeftChild == null) 
     { 
      root.LeftChild = newNode; 
     } 
     else 
     { 
      InsertNodeToTreeHelper(root.LeftChild, newNode); 
     } 
    } 
    else 
    { 
     if(root.RightChild == null) 
     { 
      root.RightChild = newNode; 
     } 
     else 
     { 
      InsertNodeToTreeHelper(root.RightChild, newNode); 
     } 
    } 
} 

이것은 또한 재귀없이 수행 할 수 있습니다 (내가 추천하는 나는 것 같아 코드를 대단히 간소화하고 도우미 메서드의 필요성을 제거합니다.

+0

환자 분들과 철저한 답변에 감사드립니다. 지금 받으 셨습니다! – JavaSa

+0

모든 혼란은'var currRoot = Root;InsertNodeToTreeHelper (ref currRoot, newNode);'InsertNodeToTreeHelper (ref Root, newNode);와 같습니다. 제 컴파일러가 속성 (Root)을 ref 변수로 전달한다는 사실을 싫어했기 때문에이 해결 방법을 사용했습니다. – JavaSa

+0

하지만 property \ class 데이터 멤버를 ref로 전달할 수 있다면 우리의 대화에서 볼 수 있듯이 작동해야합니다. – JavaSa

0

하나의 문제는 당신이 참조하여 로컬 변수에 전달하는 것입니다. 함수 InsertNodeToTreeHelper에 의해 수정 된 경우 currRootLeftChild가 범위를 벗어나면 변경 사항이 버려집니다. 이 코드가 작동하려면 로컬 참조가 아닌 currTreeRoot의 참조를 전달해야합니다.

+0

로컬 변수 (함수 매개 변수)에 루트 (특성)를 전달할 때 문제가 있다고 생각하지 않는다. 참조로 전달합니다. – JavaSa

+1

@ JavaSa 문제가 아니더라도 주어진 코드에서 아무 것도하지 않습니다. 메서드에 ref 매개 변수를 전달하면 해당 메서드에서 전달 된 변수의 * 값 *을 수정할 수 있습니다. 'TreeNode'는 아마 클래스의 참조 형이므로, * value *는 참조이므로, 여기서 참조로 전달하면 다른 'TreeNode'에서 변수를 가리킬 수 있습니다. 그러나 실제로는 결과로 어떤 것도하지 않습니다. – Kyle