2017-09-16 2 views
0

다른 클래스의 개체 값을 변경하려고합니다. 이상적으로, 나는 생성자/메소드에 매개 변수로 객체를 전달하려고합니다. 지금까지 읽은 내용은 매개 변수로 전달 될 때 객체가 참조로 동작하고 매개 변수 값이 메소드의 본문에 사용하기 위해 로컬로 복사됩니다. 그래서 여기에 내가 테스트 한 몇 가지 구성이 있습니다 :C# 다른 클래스를 통해 개체 값 변경

케이스 # 1. 나는 Processor 테이블 mainTable에 동일한 참조를 보유하고 생각했지만, Processor 표가 작성하는 동안 Main 실행 mainTable의 말에 여전히 비어

class Processor 
{ 
    DataTable table; 

    public Processor(DataTable table) 
    { 
     this.table = table; 
    } 

    public void InitializeTable() 
    { 
     if (table != null) 
     { 
      // Fill data into DataTable. 
     } 
    } 
} 

static void Main(string[] args) 
{ 
    DataTable mainTable = new DataTable(); 

    Processor processor = new Processor(mainTable); 
    processor.InitializeTable(); 
    // mainTable still empty  
} 

못했습니다.

사례 # 2. 내가 ref 서명을 사용하여 시도했다

public Processor(ref DataTable table) 
{ 
    this.table = table; 
} 

실패,하지만 결과는 여전히 같은 ( mainTable는 비어).

사례 # 3. 내가 생성자를 제거하고 InitializeTable() 방법에 mainTable를 공급 한

public void InitializeTable(DataTable table) 
{ 
    // Fill data into table 
} 

실패하고, 결과는 여전히 같은 (mainTable는 비어).

사례 # 4. 공장!

public void InitializeTable(ref DataTable table) 
{ 
    // Fill data into table 
} 

마지막으로 작동합니다! InitializeTableref mainTable을 공급하면 mainTable이 성공적으로 채워집니다. 이것의 뒤에있는 설명은 무엇입니까? 생성자가 mainTable과 동일한 참조를 가지고 있지 않은 이유는 무엇입니까? 매개 변수로 객체를 전달할 때 여전히 ref 키워드가 필요한 이유는 이미 참조를 전달한다는 의미입니까?

+0

'InitializeTable()'은 실제로 무엇을합니까? 첫 번째 예에서 필자는'mainTable'이 변경 사항을 반영 할 것으로 기대합니다. 단 하나의 실제 'DataTable'만이 메모리에 인스턴스화되기 때문입니다. – David

+0

데이터베이스에서 데이터를 가져 와서 테이블에 할당하는 간단한 쿼리입니다. 그래, 나도 똑같은 가정을하고 있지만, 케이스 # 4만이 메인 테이블을 채웠다. – Suwandy

+0

구체적으로 "테이블에 지정 하시겠습니까?" 코드가 예상 한대로 작동하지 않는 경우 코드를 막연하게 설명하고 실제로 작동해야한다고 가정하고 실제로 검사하십시오. – David

답변

0

신용 다윗로 이동 :

를 다음 동작을 설명하는. 로컬 테이블 변수를 새 DataTable 인스턴스 (.SelectArray()에 의해 반환 됨)에 다시 할당합니다. 따라서 은 더 이상 mainTable 변수와 동일한 인스턴스를 참조하지 않으며 은 더 이상 해당 인스턴스를 수정하지 않습니다.

+0

그래서'읽기 전용 데이터 테이블'을 의미했습니다. 권장 사항. –