다른 클래스의 개체 값을 변경하려고합니다. 이상적으로, 나는 생성자/메소드에 매개 변수로 객체를 전달하려고합니다. 지금까지 읽은 내용은 매개 변수로 전달 될 때 객체가 참조로 동작하고 매개 변수 값이 메소드의 본문에 사용하기 위해 로컬로 복사됩니다. 그래서 여기에 내가 테스트 한 몇 가지 구성이 있습니다 :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
}
마지막으로 작동합니다! InitializeTable
에 ref mainTable
을 공급하면 mainTable
이 성공적으로 채워집니다. 이것의 뒤에있는 설명은 무엇입니까? 생성자가 mainTable
과 동일한 참조를 가지고 있지 않은 이유는 무엇입니까? 매개 변수로 객체를 전달할 때 여전히 ref
키워드가 필요한 이유는 이미 참조를 전달한다는 의미입니까?
'InitializeTable()'은 실제로 무엇을합니까? 첫 번째 예에서 필자는'mainTable'이 변경 사항을 반영 할 것으로 기대합니다. 단 하나의 실제 'DataTable'만이 메모리에 인스턴스화되기 때문입니다. – David
데이터베이스에서 데이터를 가져 와서 테이블에 할당하는 간단한 쿼리입니다. 그래, 나도 똑같은 가정을하고 있지만, 케이스 # 4만이 메인 테이블을 채웠다. – Suwandy
구체적으로 "테이블에 지정 하시겠습니까?" 코드가 예상 한대로 작동하지 않는 경우 코드를 막연하게 설명하고 실제로 작동해야한다고 가정하고 실제로 검사하십시오. – David