문제

BY Ref 질문에 변형이 있습니다. Ref 또는 우리의 매개 변수로 호출하고 그것이 변수와 그 값에 어떤 영향을 미치는지에 대해 모두 알고 있습니다. 나는이 문제가 데이터 가능으로 이슈를 가지고 있었고 데이터 가능이 간단한 정수 변수와 다른 이유를 알고 싶습니다.

문제를 해결하는 방법에 대한 신체적 대답이 있지만 문제가 왜 작동하는지 알고 싶습니다.

간단한 변수를 사용하면 내가 예상 한 바에요

        int mVar1 = 1;
        int mVar2 =1;

        mVar2 = mVar1;

        mVar2 = 5;

        Console.WriteLine(mVar1.ToString());
        Console.WriteLine(mVar2.ToString());

콘솔에 1,5를 표시합니다.

그러나 DataTable을 사용하여 동일한 작업을 수행하면 새로운 값 대신 첫 번째 데이터 가능을 참조합니다.

        DataTable mVar3 = new DataTable();
        DataTable mVar4 = new DataTable();


         // Create DataColumn objects of data types.
        DataColumn colString = new DataColumn("StringCol");
        colString.DataType = System.Type.GetType("System.String");
        mVar3.Columns.Add(colString);

        // Create DataColumn objects of data types.
        DataColumn colString2 = new DataColumn("StringCol123");
        colString2.DataType = System.Type.GetType("System.String");
        mVar4.Columns.Add(colString2);

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }
        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

                mVar4 = mVar3;

        //change mVar4 somehow and see if mVar3 changes


        foreach (DataColumn tCol in mVar4.Columns)
        {
            tCol.ColumnName = "Test";

        }

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

콘솔 표시 : StringCol StringCol123 테스트 테스트

mvar4 = mvar3를 말함으로써 mvar4는 mvar3에 대한 참조가된다.

이 문제에 대한 해결책은 말할 것입니다

DataTable mVar4 = mVar3.Copy(); 

따라서 내 질문은 다음과 같습니다. Datatable이 간단한 정수 필드와 다르게 수행하도록하는 것입니다. DataTable의 다른 사본 대신 MVAR4 = MVAR3을 사용할 때 왜 참조를 생성합니까?

도움이 되었습니까?

해결책

참조 유형과 값 유형의 차이점에 대해 실행 중입니다.

여기에 있습니다 MSDN 기사 차이점.

보다 설명적인 대답은 둘 다 실제로 동일한 작업을 수행한다는 것입니다. 차이점은 첫 번째 예 (두 정수)에서 MVAR2 = MVAR1의 할당이 MVAR1의 값을 MVAR2에 할당한다는 것입니다. DataTable의 경우 실제로 할당되는 것은 데이터 가능이 아닌 메모리 위치입니다.

예를 들어, 당신이 만든 데이터 가능은 메모리 위치 20에 상주한다고 가정합니다. 즉, 참조 mvar1은 그 위치에 대한 참조를 보유한다는 것을 의미합니다 (20). 할당 MVAR2 = MVAR1을 수행 할 때 MVAR2에 MVAR1과 동일한 값을 보유하도록 지시하므로 MVAR2는 메모리 위치 20에 대해서도 참조합니다. 결과는 두 변수 모두 동일한 데이터 가능성을 참조합니다.

설명하는 행동을 달성하려면 실제로 언급했듯이 사본 능력이 있어야합니다. 완전히 새로운 개체를 할당하고 이전 객체의 상태를 새 개체에 복사해야합니다.

DataTable 클래스의 경우 확장 방법 내부에서 다음과 같이 확장 할 수 있습니다.

public static DataTable Copy(this DatTable original)
{
   var result = new DataTable();
   //assume Property1 was a property of a DataTable
   result.Property1 = original.Property1; 
   //continue copying state from original to result
   return result;
}

다른 팁

호출 mvar2 = mvar1; MVAR1의 위치에 저장된 값을 복사합니다. 이 시나리오에서는 1이 위치 mvar2에 복사된다는 것을 의미합니다. 두 번째 상황에서 MVAR3에 저장된 값은 다시 MVAR4의 위치에 복사됩니다. 그러나이 경우 데이터 가능은 참조 유형이기 때문에 복사 된 값은 실제 데이터 가능한 객체에 대한 참조입니다.

더 보여 주려면 게시 한 코드의 끝에 다음을 추가하십시오.

        mVar4 = new DataTable();
        // Create DataColumn objects of data types.
        DataColumn colString3 = new DataColumn("StringCol1234");
        colString2.DataType = System.Type.GetType("System.String");
        mVar4.Columns.Add(colString3);

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName); // still outputs test

        }

        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName); // now outputs StringCol1234

        }

여기서 MVAR4를 데이터 가능의 새로운 인스턴스로 다시 설정하면 변경 사항이 MVAR3에 반영되지 않습니다. 호출 mvar4 = new DataTable (); MVAR4의 위치에서 기준을 변경하면 MVAR4에서 참조 된 객체를 변경하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top