programing

심판에게 전달된 목록 - 이 동작을 설명하는 데 도움이 됩니다.

easyjava 2023. 4. 9. 22:32
반응형

심판에게 전달된 목록 - 이 동작을 설명하는 데 도움이 됩니다.

다음의 프로그램을 봐 주세요.

class Test
{
    List<int> myList = new List<int>();

    public void TestMethod()
    {
        myList.Add(100);
        myList.Add(50);
        myList.Add(10);

        ChangeList(myList);

        foreach (int i in myList)
        {
            Console.WriteLine(i);
        }
    }

    private void ChangeList(List<int> myList)
    {
        myList.Sort();

        List<int> myList2 = new List<int>();
        myList2.Add(3);
        myList2.Add(4);

        myList = myList2;
    }
}

짐작으로는myListref은 ', 하다, 하다.

3
4

는 ' '참조 합격'은 '참조 합격'입니다.sort기능이 유효하게 됩니다. 문장은 다음과 같습니다.myList = myList2;과가없없 없없없다다

출력은 다음과 같습니다.

10
50
100

이 행동을 설명하는 것을 도와줄 수 있나요?myList는 참조에 의해 전달되지 않습니다(에서 알 수 있음).myList = myList2않음)는 어떻게 활성화됩니까?myList.Sort()력이이발?발 생??

나는 그 진술조차 효력을 발휘하지 못하고 다음과 같은 결과가 나온다고 가정하고 있었다.

100
50
10

처음에는 다음과 같이 그래픽으로 나타낼 수 있습니다.

초기화 상태

다음 이 됩니다.myList.Sort(); 집합 정렬

했을 때:myList' = myList2원본이 아닌 참조 중 하나를 잃어버렸고 컬렉션은 정렬된 상태로 유지되었습니다.

참조 손실

하는 경우( 「 」 「 」 「 」 「 。ref) 그 、 。myList' ★★★★★★★★★★★★★★★★★」myList(1월 1일) 이에요.

주의: 사용하고 있습니다.myList'.ChangeList에) (원래와 같은 이름을 붙였으므로)

리스트에 대한 참조를 전달하고 있지만 참조의한 리스트 변수 전달되지 않았습니다.따라서 전화했을 때ChangeList변수 값(즉, 참조 - "sink "discuption")이 복사되고 내부 매개변수 값으로 변경됩니다.ChangeList 보이지 않다TestMethod.

시험:

private void ChangeList(ref List<int> myList) {...}
...
ChangeList(ref myList);

그러면 로컬 변수에 대한 참조가 전달됩니다. myRef(에서한 바와 TestMethod하면;;;;;;;;;;;;; "ChangeList내부 변수도 재할당합니다. TestMethod.

여기 그것을 이해하는 쉬운 방법이 있다.

  • 목록은 힙에 작성된 개체입니다. ''myList는 그 오브젝트에 대한 참조입니다.

  • C#에서는 오브젝트를 전달하지 않고 값에 따라 오브젝트의 참조를 전달합니다.

  • 있는 를 통해 할 ChangeList(예를 들어 정렬 중에) 원래 목록이 변경됩니다.

  • ChangeListmethod는 참조 값에 적용되므로 원래 목록에는 변경되지 않습니다(히프에서는 아직 참조되지만 메서드 변수에서는 참조되지 않음).

링크는 C#의 pass by reference를 이해하는 데 도움이 됩니다.기본적으로 참조 유형의 개체가 메서드에 값으로 전달되면 해당 개체에서 사용할 수 있는 메서드만 개체의 내용을 수정할 수 있습니다.

예를 들어 List.sort() 메서드는 List 내용을 변경하지만 다른 개체를 같은 변수에 할당하면 해당 메서드에 로컬로 할당됩니다.그렇기 때문에 myList는 변경되지 않습니다.

ref 키워드를 사용하여 참조 유형의 개체를 전달하면 동일한 변수에 다른 개체를 할당할 수 있으며 개체 자체가 변경됩니다.

(편집: 에 링크된 문서의 업데이트된 버전입니다.)

은 해당 가 C#을 실행하지 않는 한될 때 합니다.ICloneable 그것은 (그것은)List클래스

의미냐면요, ''를 하는 거예요.List내의 의 오브젝트와 합니다.List

요.List " ", " " 를합니다.List( ( ( ( ( ( ( ( ( 。그 에 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 하다myList전체가 「」의 「」에 대해서입니다.List의 「」만이 됩니다.List이 정수를 참조하고 있습니다.

자세한 내용은 이 MSDN 기사 "Passing Parameters"의 "Passing Reference-Type Parameters" 섹션을 참조하십시오.

StackOverflow의 "How do I Clone a Generic List in C#"에서는 목록을 상세하게 복사하는 방법에 대해 설명합니다.

나는 위에서 말한 모든 것에 동의하지만.나는 이 코드에 대해 다른 견해를 가지고 있다.기본적으로 새 목록을 글로벌이 아닌 로컬 변수 myList에 할당합니다.ChangeList(List myList)의 시그니처를 private void ChangeList()로 변경하면 3, 4의 출력이 표시됩니다.

제 추론은 이렇습니다...목록이 참조에 의해 전달되더라도 포인터 변수를 값별로 전달한다고 생각하십시오. ChangeList(myList)를 호출하면 포인터가 (Global) myList에 전달되는 것입니다.이것으로 이것은 (로컬) myList 변수에 저장됩니다.(로컬) myList와 (글로벌) myList가 같은 목록을 가리키고 있습니다.(로컬) myList가 원래 (글로벌) myList를 참조하고 있기 때문에 => 정렬을 실행합니다.다음으로 새로운 목록을 만들고 포인터를 해당 (로컬) myList에 할당합니다.단, 함수가 (로컬) myList 변수가 종료되는 즉시 파기됩니다.HTH

class Test
{
    List<int> myList = new List<int>();
    public void TestMethod()
    {

        myList.Add(100);
        myList.Add(50);
        myList.Add(10);

        ChangeList();

        foreach (int i in myList)
        {
            Console.WriteLine(i);
        }
    }

    private void ChangeList()
    {
        myList.Sort();

        List<int> myList2 = new List<int>();
        myList2.Add(3);
        myList2.Add(4);

        myList = myList2;
    }
}

하다를 사용하세요.ref키워드를 지정합니다.

통과 매개 변수를 이해하려면 여기에서 최종 참조를 참조하십시오.
구체적으로 말하면, 이 코드의 동작을 이해하기 위해서, 이것을 봐 주세요.

집::Sort는 같은 기준(값으로 전달됨)으로 동작하기 때문에 값이 정렬됩니다.에 새로운 전달되기 , 는 「」, 「」, 「」, 「」, 「」를 입력하지 않는 한, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」를 입력합니다.ref.

「 」를 .ref 포인터를 할 수 .List당신의 경우는요.ref기존 파라미터로 작업할 수 있지만 다른 파라미터를 가리키도록 할 수 없습니다.

참조 타입의 오브젝트에는, 2개의 메모리 부분이 할당되어 있습니다.하나는 스택에, 다른 하나는 힙에 있습니다.스택의 부품(포인터라고도 함)에는 실제 값이 저장되는 힙의 부품에 대한 참조가 포함됩니다.

ref 키워드를 사용하지 않으면 스택 내의 부품 복사본만 생성되어 메서드(히프 내의 동일한 부품 참조)로 전달됩니다.따라서 힙 부분에서 무언가를 변경해도 해당 변경은 그대로 유지됩니다.복사된 포인터를 힙의 다른 위치를 참조하도록 할당하여 변경할 경우 메서드 외부의 오리진 포인터에는 영향을 주지 않습니다.

언급URL : https://stackoverflow.com/questions/4311226/list-passed-by-ref-help-me-explain-this-behaviour

반응형